You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
/**
* <p>User: Zhang Kaitao
* <p>Date: 14-1-28
* <p>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<String> roles = userService.findRoles(username);
// 获取用户的权限
Set<String> 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();
}
}