package com.project.shiro.util; import com.alibaba.fastjson.JSONObject; import com.project.model.core.Admin; import com.project.model.core.Menu; import com.project.model.core.Role; import com.project.service.core.AdminService; import com.project.service.core.MenuService; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.Permission; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import javax.annotation.Resource; import java.io.PrintWriter; import java.util.*; /** * 认证 */ public class AuthenticationRealm extends AuthorizingRealm { @Resource(name = "adminServiceImpl") private AdminService adminService; @Resource(name = "menuServiceImpl") private MenuService menuService; /** * 获取认证信息 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken token) { AuthenticationToken authToken = (AuthenticationToken) token; // 获取登录名、密码 String username = authToken.getUsername(); String password = new String(authToken.getPassword()); if (username != null && password != null) { Admin admin = adminService.getByLoginName(username); if (admin == null) { throw new UnknownAccountException(); } if (!admin.getStatus().equals(Admin.STATUS_ENUM.ENABLE.getValue())) { throw new DisabledAccountException(); } //用户锁定 if (admin.getIsLocked()) { //账号锁定分钟数 Date lockedDate = admin.getLockedDate(); Date unlockedDate = DateUtils.addMinutes(lockedDate, 10); //判断锁定时间是否已过 if (new Date().after(unlockedDate)) { admin.setLoginFailCnt(0); admin.setIsLocked(false); admin.setLockedDate(null); adminService.update(admin); } else { throw new LockedAccountException(); } } //密码不正确 if (!DigestUtils.md5Hex(password).equals(admin.getLoginPwd())) { int loginFailCount = admin.getLoginFailCnt() + 1; if (loginFailCount >= 5) { admin.setIsLocked(true); admin.setLockedDate(new Date()); } admin.setLoginFailCnt(loginFailCount); adminService.update(admin); throw new IncorrectCredentialsException(); } admin.setLoginFailCnt(0); adminService.update(admin); return new SimpleAuthenticationInfo(new Principal(admin.getId(), username), password, getName()); } throw new UnknownAccountException(); } /** * 获取授权信息 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { Principal principal = (Principal) principals.fromRealm(getName()).iterator().next(); if (principal != null) { SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo(); //获取admin对象 Admin adminTemp = new Admin(); adminTemp.setId(principal.getId()); List<Admin> admins = adminService.getAdminCascadeRole(adminTemp); Admin admin = admins.get(0); //获取用户的角色信息 Set<String> roleSet = new HashSet<String>(); for (Role role : admin.getRoles()) { if (role.getStatus().equals(Role.STATUS_ENUM.ENABLE.getValue())) { roleSet.add(role.getRoleCode()); } } //根据角色ids获取权限信息 List<Menu> menuList = menuService.findOrdinaryMenu(principal.getId()); Set<String> menuSet = new HashSet<String>(); for (Menu menu : menuList) { if (StringUtils.isNotBlank(menu.getCode())) { menuSet.add(menu.getCode()); } } //将角色和资源放入授权对象中 authInfo.addRoles(roleSet); authInfo.addStringPermissions(menuSet); return authInfo; } return null; } /** * 超级管理员自动获取所有权限 */ // @Override // public boolean isPermitted(PrincipalCollection principals, String permission) { //// User user = ((User) principals.getPrimaryPrincipal()); //// if (Role.ADMIN_FLAG_SUPER_ADMIN == user.getRole().getAdminFlag()) { //// return true; //// } // // return isPermitted(principals, getPermissionResolver().resolvePermission(permission)); // } @Override public boolean isPermitted(PrincipalCollection principals, Permission permission) { AuthorizationInfo info = getAuthorizationInfo(principals); Collection<Permission> perms = getPermissions(info); if (CollectionUtils.isEmpty(perms)) { return false; } for (Permission perm : perms) { if (perm.implies(permission)) { return true; } } return false; } /** * 踢掉上一个登录的同名用户 * * @param id 主键 */ // private void stopPreviousSession(Integer id) { // Collection<Session> sessions = sessionDAO.getActiveSessions(); // Session currSession = SecurityUtils.getSubject().getSession(); // Serializable sId = currSession.getId(); // for (Session session : sessions) { // SimplePrincipalCollection collection = (SimplePrincipalCollection) session // .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); // if (collection == null) { // continue; // } // // User u = (User) collection.getPrimaryPrincipal(); // if (id.equals(u.getId())) { // if (sId.equals(session.getId())) { // continue; // } // // session.stop(); // break; // } // } // } }