package com.xmomen.module.account.realm; import com.xmomen.module.account.service.UserService; import com.xmomen.module.core.web.token.SysUserToken; import com.xmomen.module.user.entity.SysUsers; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.LockedAccountException; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UnknownAccountException; 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.apache.shiro.util.ByteSource; import java.util.Set; /** *

User: Zhang Kaitao *

Date: 14-1-28 *

Version: 1.0 */ public class UserRealm extends AuthorizingRealm { // 注入UserService private UserService userService; // 设置UserService public void setUserService(UserService userService) { this.userService = userService; } // 获取用户的授权信息 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 获取用户名 String username = (String)principals.getPrimaryPrincipal(); // 获取用户的角色 Set roles = userService.findRoles(username); // 获取用户的权限 Set realmNames = principals.getRealmNames(); for(String realmName: realmNames) { if(realmName.contains("UserRealm")) { roles.add("user"); } } // 创建SimpleAuthorizationInfo对象 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 设置用户的角色 authorizationInfo.setRoles(roles); // 设置用户的权限 authorizationInfo.setStringPermissions(userService.findPermissions(username)); return authorizationInfo; } // 判断是否支持该类型的token @Override public boolean supports(AuthenticationToken token) { if(token instanceof SysUserToken) { return super.supports(token); } return false; } // 获取用户的认证信息 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 获取用户名 String username = (String)token.getPrincipal(); // 根据用户名获取用户信息 SysUsers user = userService.findByUsername(username); // 如果用户不存在,抛出UnknownAccountException异常 if(user == null) { throw new UnknownAccountException();//没找到帐号 } // 如果用户被锁定,抛出LockedAccountException异常 if(Boolean.TRUE.equals(user.getLocked())) { throw new LockedAccountException(); //帐号锁定 } //交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配,如果觉得人家的不好可以自定义实现 // 创建SimpleAuthenticationInfo对象 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( username, //用户名 user.getPassword(), //密码 ByteSource.Util.bytes(user.getSalt()),//salt=salt getName() //realm name ); return authenticationInfo; } // 清除用户的授权信息 @Override public void clearCachedAuthorizationInfo(PrincipalCollection principals) { super.clearCachedAuthorizationInfo(principals); } // 清除用户的认证信息 @Override public void clearCachedAuthenticationInfo(PrincipalCollection principals) { super.clearCachedAuthenticationInfo(principals); } // 清除用户的缓存信息 @Override public void clearCache(PrincipalCollection principals) { super.clearCache(principals); } // 清除所有用户的授权信息 public void clearAllCachedAuthorizationInfo() { getAuthorizationCache().clear(); } // 清除所有用户的认证信息 public void clearAllCachedAuthenticationInfo() { getAuthenticationCache().clear(); } // 清除所有用户的缓存信息 public void clearAllCache() { clearAllCachedAuthenticationInfo(); clearAllCachedAuthorizationInfo(); } }