package com.lyms.cm.shiro; import java.util.Arrays; import java.util.HashSet; import org.apache.shiro.authc.AccountException; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.credential.AllowAllCredentialsMatcher; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.lyms.cm.entity.sys.User; import com.lyms.cm.service.sys.ResourceService; import com.lyms.cm.service.sys.UserService; import com.lyms.shiro.HashUtils; import com.lyms.shiro.ShiroWebUtils; import com.lyms.util.StrUtils; /** *
  • @ClassName: ShiroRealm *
  • @Description: 自定义Realm授权与验证实现 *
  • @author 方承 *
  • @date 2015年12月29日 *
  • */ public class ShiroRealm extends AuthorizingRealm { @SuppressWarnings("unused") private static Logger logger = LoggerFactory.getLogger(ShiroRealm.class); public ShiroRealm() { super(new AllowAllCredentialsMatcher()); setAuthenticationTokenClass(UsernamePasswordToken.class); //FIXME: 暂时禁用Cache setCachingEnabled(false); } @Autowired private UserService userService; @Autowired private ResourceService resourceService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); User user = userService.getUserByUserName(username); // 授权 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); if(StrUtils.isNotEmpty(user.getRoles())){ authorizationInfo.setRoles(new HashSet(Arrays.asList(user.getRoles().split(",")))); } authorizationInfo.setStringPermissions(resourceService.getResourcePermissionSet(userService.getUserResourceIdSet(user))); return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authcToken; String username = token.getUsername(); User user = userService.getUserByUserName(username); if (user == null) { throw new UnknownAccountException("未知用户"); } StringBuilder pwd = new StringBuilder(100); for (int i = 0; i < token.getPassword().length; i++) { pwd.append(token.getPassword()[i]); } if (!StrUtils.equals(user.getPassword(), HashUtils.md5(pwd.toString()))) { throw new AccountException("用户名密码不一致"); } ShiroWebUtils.saveCurrentUser(user); AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(username, pwd.toString(), username); return authcInfo; } }