shiro权限管理的配置
@Configuration
public class ShiroConfig {
@Bean(name="rediscachemanager")
public RedisCacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager();
RedisManager redisManager = redisManager();
redisCacheManager.setRedisManager(redisManager);
redisCacheManager.setKeyPrefix(SecurityConsts.PREFIX_SHIRO_CACHE);
redisCacheManager.setExpire(redisManager.getTimeout());
return redisCacheManager;
}
private RedisManager redisManager() {
ShiroRedisConfig shiroRedisConfig = SpringContextHolder.getBean(ShiroRedisConfig.class);
RedisManager redisManager = new RedisManager();
redisManager.setHost(shiroRedisConfig.getHost());
redisManager.setPort(shiroRedisConfig.getPort());
redisManager.setDatabase(shiroRedisConfig.getDatabase());
redisManager.setTimeout(shiroRedisConfig.getTimeout());
redisManager.setPassword(shiroRedisConfig.getPassword());
return redisManager;
}
@Bean
public RedisSessionDAO redisSessionDAO() {
RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
redisSessionDAO.setRedisManager(redisManager());
redisSessionDAO.setSessionIdGenerator(jwtUuidSessionIdGenerator());
return redisSessionDAO;
}
@Bean
public JwtUuidSessionIdGenerator jwtUuidSessionIdGenerator() {
return new JwtUuidSessionIdGenerator();
}
@Bean
public RedisCache<String, String> shiroCache() {
RedisManager redisManager = redisManager();
return new RedisCache<>(redisManager,
new StringSerializer(),
new ObjectSerializer(),
SecurityConsts.PREFIX_SHIRO_CACHE + SecurityConsts.PREFIX_SHIRO_JWT + ":",
redisManager.getTimeout(),
RedisCacheManager.DEFAULT_PRINCIPAL_ID_FIELD_NAME);
}
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
@DependsOn("lifecycleBeanPostProcessor")
public static DefaultAdvisorAutoProxyCreator getLifecycleBeanPostProcessor() {
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
return defaultAdvisorAutoProxyCreator;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
@Bean
public DefaultWebSecurityManager securityManager(ShiroRealm shiroRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(shiroRealm);
securityManager.setCacheManager(cacheManager());
securityManager.setSessionManager(sessionManager());
return securityManager;
}
@Bean
public DefaultWebSessionManager sessionManager() {
JwtSessionManager sessionManager = new JwtSessionManager();
sessionManager.setSessionDAO(redisSessionDAO());
sessionManager.setSessionIdCookieEnabled(false);
return sessionManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
shiroFilter.setLoginUrl("/user/auth/login");
shiroFilter.setUnauthorizedUrl("/global/api/error");
Map<String, Filter> filterMap = new HashMap<>();
filterMap.put("jwt", jwtFilter());
filterMap.put("kickout", kickoutSessionControlFilter());
filterMap.put("user", new AppUserFilter());
shiroFilter.setFilters(filterMap);
Map<String, String> hashMap = new LinkedHashMap<>();
for (String nonePermissionRe : SystemConst.NONE_PERMISSION_RES) {
hashMap.put(nonePermissionRe, "anon");
}
hashMap.put("/**", "jwt,user,kickout");
shiroFilter.setFilterChainDefinitionMap(hashMap);
return shiroFilter;
}
@Bean
public ApiKickOutSessionControlFilter kickoutSessionControlFilter() {
ApiKickOutSessionControlFilter kickoutSessionControlFilter = new ApiKickOutSessionControlFilter();
kickoutSessionControlFilter.setKickoutAfter(false);
kickoutSessionControlFilter.setCacheManager(cacheManager());
kickoutSessionControlFilter.setMaxSession(1);
return kickoutSessionControlFilter;
}
@Bean
public JwtFilter jwtFilter() {
return new JwtFilter();
}
}
shiro 鉴权类,主要是login之后的逻辑处理
import com.zeus.config.token.JwtToken;
import com.zeus.core.shiro.ShiroKit;
import com.zeus.pojo.dao.origin.User;
import com.zeus.pojo.vo.common.ShiroUser;
import com.zeus.service.auth.UserAuthService;
import com.zeus.utils.ToolUtil;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.crazycake.shiro.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Component
public class ShiroRealm extends AuthorizingRealm {
@Qualifier(value = "adminUserAuthService")
@Autowired
private UserAuthService userAuthService;
@Autowired
private RedisCache<String, String> shiroCache;
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof JwtToken;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth)
throws AuthenticationException {
JwtToken token = (JwtToken) auth;
User user = userAuthService.getUserByAccountOrPhone(token.getUsername());
ShiroUser shiroUser = userAuthService.shiroUser(user);
return userAuthService.info(shiroUser, user, super.getName());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
ShiroUser shiroUser = ShiroKit.getShiroUser();
List<Long> roleList = shiroUser.getRoleList();
Set<String> permissionSet = new HashSet<>();
Set<String> roleNameSet = new HashSet<>();
for (Long roleId : roleList) {
List<String> permissions = userAuthService.findPermissionsByRoleId(roleId);
if (permissions != null) {
for (String permission : permissions) {
if (ToolUtil.isNotEmpty(permission)) {
permissionSet.add(permission);
}
}
}
String roleName = userAuthService.findRoleNameByRoleId(roleId);
roleNameSet.add(roleName);
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(permissionSet);
info.addRoles(roleNameSet);
return info;
}
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
super.setCredentialsMatcher(md5CredentialsMatcher);
}
}