@Component public class CceedAccessControlEntity extends AccessControlEntity { @Resource private RedisTemplate redisTemplate; @Value("${auth.enable:true}") private boolean enableAuth; @Override public boolean canAccess(String funcName) { if (!enableAuth) { return true; } if (StringUtils.isEmpty(funcName)) { return false; } return canAccessInternal(funcName); } private boolean canAccessInternal(String funcName) { SysUserDetails sysUserDetails = (SysUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (sysUserDetails == null || StringUtils.isEmpty(sysUserDetails.getUserId())) { return false; } String key = CacheKeyUtils.buildCacheKey(RedisCacheKeys.USER_PERMISSION_CACHE, sysUserDetails.getUserId(), RedisCacheKeys.USER_CACHE); List<String> permissions = (List<String>) redisTemplate.opsForValue().get(key); if (CollectionUtils.isEmpty(permissions)) { return false; } return permissions.contains(funcName); } }
时间: 2024-02-14 12:26:18 浏览: 25
根据你提供的代码,你继承了一个名为 `AccessControlEntity` 的类,并重写了其中的 `canAccess` 方法。在重写的方法中,你使用了 `@Value` 注解来注入了一个名为 `enableAuth` 的布尔类型变量,并使用了 `StringUtils` 类和 `SecurityContextHolder` 来进行权限验证。
根据你的代码,重写的方法看起来是正确的。但是,如果重写的方法不生效,可能还有其他原因导致问题。
1. 检查父类方法是否被正确调用:如果你在其他地方调用了 `canAccess` 方法,并且没有使用子类的实例进行调用,那么重写的方法将不会被执行。请确保在需要调用 `canAccess` 方法的地方使用了子类的实例进行调用。
2. 检查父类方法的访问修饰符:如果父类中的 `canAccess` 方法被声明为 `private`,那么子类是无法重写该方法的。请确保父类方法的访问修饰符是 `protected` 或 `public`。
3. 检查依赖注入是否成功:你在子类中使用了 `@Resource` 注解来注入了一个名为 `redisTemplate` 的依赖。请确保该依赖被成功注入,并且在使用时不会出现空指针异常。
如果以上解决方案都不能解决问题,请提供更多关于问题的详细信息,以便我更好地帮助你解决问题。
相关问题
@Component public class CceedAccessControlEntity extends AccessControlEntity { @Resource private RedisTemplate redisTemplate; @Value("${auth.enable:true}") private boolean enableAuth; }
根据你提供的代码,你继承了一个名为 `AccessControlEntity` 的类,并在子类 `CceedAccessControlEntity` 中添加了一些新的成员变量。从代码中看,你使用了 `@Component` 注解来标识 `CceedAccessControlEntity` 类作为一个 Spring Bean。
根据你的描述,问题可能出现在子类中的重写代码上。如果你在子类中重写了父类的方法,但重写的代码不生效,有几个可能的原因:
1. 确保你在子类中正确地重写了父类的方法。在你提供的代码中,并没有看到你重写父类方法的部分。请确保你使用相同的方法名和签名来重写父类的方法。
2. 检查父类方法的访问修饰符。如果父类中被重写的方法的访问修饰符是 `private`,那么子类是无法重写该方法的。请确保父类方法的访问修饰符是 `protected` 或 `public`。
3. 确保重写的方法被正确调用。如果你在其他地方调用了该方法,确保调用的是子类中重写的方法,而不是父类中原有的方法。
如果以上解决方案都不能解决问题,请提供更多关于你重写代码以及哪些功能不生效的信息,以便我更好地帮助你解决问题。
代码解释:@Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){ RedisTemplate<String, Object> template = new RedisTemplate<>(); templa
这段代码是用于配置 Redis 的缓存,使用了 Spring 提供的缓存框架。具体解释如下:
- `@Configuration`:声明这个类是一个配置类,相当于传统的 XML 配置文件。
- `@EnableCaching`:启用缓存支持。
- `RedisConfig extends CachingConfigurerSupport`:继承了 `CachingConfigurerSupport` 类,这个类提供了一些缓存配置的默认实现,可以让我们重写需要的方法来实现自定义配置。
- `@Bean`:声明这个方法返回一个 Spring 管理的 Bean 对象。
- `RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory)`:定义了一个名为 `redisTemplate` 的 Bean,这个 Bean 的类型是 `RedisTemplate<String, Object>`,返回的是 RedisTemplate 对象。
- `RedisConnectionFactory factory`:声明了一个名为 `factory` 的参数,这个参数是 `RedisConnectionFactory` 类型,表示这个 Bean 需要一个 RedisConnectionFactory 对象作为参数。
- `RedisTemplate<String, Object> template = new RedisTemplate<>();`:创建一个 RedisTemplate 对象。
- `template.setConnectionFactory(factory)`:设置 RedisTemplate 对象的连接工厂,即上面传入的 RedisConnectionFactory 对象。
- `template.setValueSerializer(new GenericToStringSerializer<>(Object.class))`:设置 RedisTemplate 对象的值序列化器,这里使用了 `GenericToStringSerializer`,将任何类型的值转换为字符串后存储到 Redis 中。
- `return template`:返回 RedisTemplate 对象,这个对象将被 Spring 管理。