问题
使用@RequiresPermissions("sys:plan:list")
注解实现权限认证,发现doGetAuthorizationInfo无法被调用,尝试了网上的各种方法,终于解决了问题
代码
//自定义adminRealm
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
String uname= String.valueOf(principalCollection.getPrimaryPrincipal());
int begin = uname.indexOf("id");
int end = uname.indexOf("username");
Long id =Long.valueOf(uname.substring(begin + 3, end - 2)) ;
String[] authoritys = StringUtils.tokenizeToStringArray(
sysAdminService.getAdminAuthorityInfo(id)
, ",");
for (int i=0;i<authoritys.length;i++){
System.out.println(authoritys[i]);
}
Set<String> set = Arrays.stream(authoritys).collect(Collectors.toSet());
SimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo();
simpleAuthorizationInfo.setStringPermissions(set);
return simpleAuthorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
JwtToken jwtToken=(JwtToken)token;
String userId=jwtUtils.getClaimByToken((String)jwtToken.getPrincipal()).getSubject();
SysAdmin sysAdmin=sysAdminService.getById(Long.valueOf(userId));
if (sysAdmin == null){
throw new UnknownAccountException("账户不存在");
}
if(sysAdmin.getStatu()==-1){
throw new LockedAccountException("账户已被锁定");
}
AccountProfile profile= new AccountProfile();
BeanUtils.copyProperties(sysAdmin,profile);
System.out.println("-------------Admin--------------");
return new SimpleAuthenticationInfo(profile,jwtToken.getCredentials(),getName());
}
// ShiroConfig
@Bean
public SessionManager sessionManager(RedisSessionDAO redisSessionDAO) {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionDAO(redisSessionDAO);
return sessionManager;
}
@Bean
public DefaultWebSecurityManager securityManager(
SessionManager sessionManager,
RedisCacheManager redisCacheManager) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
Collection<Realm> realmList = new ArrayList<>();
realmList.add(accountRealm());
realmList.add(adminRealm());
securityManager.setAuthenticator(modularRealmAuthenticator());
securityManager.setSessionManager(sessionManager);
// securityManager.setCacheManager(redisCacheManager);
securityManager.setRealms(realmList);
return securityManager;
}
@Bean
public UserModularRealmAuthorizer modularRealmAuthorizer() {
UserModularRealmAuthorizer modularRealmAuthorizer = new UserModularRealmAuthorizer();
return modularRealmAuthorizer;
}
@Bean
public ModularRealmAuthenticator modularRealmAuthenticator() {
UserModularRealmAuthenticator modularRealmAuthenticator = new UserModularRealmAuthenticator();
modularRealmAuthenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
return modularRealmAuthenticator;
}
@Bean
public AdminRealm adminRealm() {
return new AdminRealm();
}
@Bean
public AccountRealm accountRealm() {
return new AccountRealm();
}
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/**", "jwt"); // 主要通过注解方式校验权限.
filterMap.put("/headImage/**", "anon");
chainDefinition.addPathDefinitions(filterMap);
return chainDefinition;
}
@Bean("shiroFilterFactoryBean")
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager,
ShiroFilterChainDefinition shiroFilterChainDefinition) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
Map<String, Filter> filters = new HashMap<>();
filters.put("jwt", jwtFilter);
shiroFilter.setFilters(filters);
Map<String, String> filterMap = shiroFilterChainDefinition.getFilterChainMap();
shiroFilter.setFilterChainDefinitionMap(filterMap);
return shiroFilter;
}
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setUsePrefix(true);
return defaultAdvisorAutoProxyCreator;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
解决
将securityManager.setCacheManager(redisCacheManager);
移除