package cc.mrbird.febs.common.authentication;
|
|
import cc.mrbird.febs.system.entity.Menu;
|
import cc.mrbird.febs.system.entity.Role;
|
import cc.mrbird.febs.system.entity.User;
|
import cc.mrbird.febs.system.service.IMenuService;
|
import cc.mrbird.febs.system.service.IRoleService;
|
import cc.mrbird.febs.system.service.IUserDataPermissionService;
|
import cc.mrbird.febs.system.service.IUserService;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.authc.*;
|
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.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.List;
|
import java.util.Set;
|
import java.util.stream.Collectors;
|
|
/**
|
* 自定义实现 ShiroRealm,包含认证和授权两大模块
|
*
|
* @author MrBird
|
*/
|
@Component
|
public class ShiroRealm extends AuthorizingRealm {
|
|
private IUserService userService;
|
private IRoleService roleService;
|
private IMenuService menuService;
|
private IUserDataPermissionService userDataPermissionService;
|
|
@Autowired
|
public void setMenuService(IMenuService menuService) {
|
this.menuService = menuService;
|
}
|
@Autowired
|
public void setUserService(IUserService userService) {
|
this.userService = userService;
|
}
|
@Autowired
|
public void setRoleService(IRoleService roleService) {
|
this.roleService = roleService;
|
}
|
@Autowired
|
public void setUserDataPermissionService(IUserDataPermissionService userDataPermissionService) {
|
this.userDataPermissionService = userDataPermissionService;
|
}
|
|
/**
|
* 授权模块,获取用户角色和权限
|
*
|
* @param principal principal
|
* @return AuthorizationInfo 权限信息
|
*/
|
@Override
|
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
|
User user = (User) SecurityUtils.getSubject().getPrincipal();
|
String userName = user.getUsername();
|
|
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
|
|
// 获取用户角色集
|
List<Role> roleList = this.roleService.findUserRole(userName);
|
Set<String> roleSet = roleList.stream().map(Role::getRoleName).collect(Collectors.toSet());
|
simpleAuthorizationInfo.setRoles(roleSet);
|
|
// 获取用户权限集
|
List<Menu> permissionList = this.menuService.findUserPermissions(userName);
|
Set<String> permissionSet = permissionList.stream().map(Menu::getPerms).collect(Collectors.toSet());
|
simpleAuthorizationInfo.setStringPermissions(permissionSet);
|
return simpleAuthorizationInfo;
|
}
|
|
/**
|
* 用户认证
|
*
|
* @param token AuthenticationToken 身份认证 token
|
* @return AuthenticationInfo 身份认证信息
|
* @throws AuthenticationException 认证相关异常
|
*/
|
@Override
|
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
|
// 获取用户输入的用户名和密码
|
String username = (String) token.getPrincipal();
|
String password = new String((char[]) token.getCredentials());
|
|
// 通过用户名到数据库查询用户信息
|
User user = this.userService.findByName(username);
|
|
if (user == null || !StringUtils.equals(password, user.getPassword())) {
|
throw new IncorrectCredentialsException("用户名或密码错误!");
|
}
|
if (User.STATUS_LOCK.equals(user.getStatus())) {
|
throw new LockedAccountException("账号已被锁定,请联系管理员!");
|
}
|
String deptIds = this.userDataPermissionService.findByUserId(String.valueOf(user.getUserId()));
|
user.setDeptIds(deptIds);
|
return new SimpleAuthenticationInfo(user, password, getName());
|
}
|
|
/**
|
* 清除当前用户权限缓存
|
* 使用方法:在需要清除用户权限的地方注入 ShiroRealm,
|
* 然后调用其 clearCache方法。
|
*/
|
public void clearCache() {
|
PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();
|
super.clearCache(principals);
|
}
|
}
|