| 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); | 
|     } | 
| } |