package com.govmade.common.oauth2; import java.util.Map; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.IncorrectCredentialsException; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.google.common.collect.Maps; import com.govmade.common.utils.Constant; import com.govmade.modules.system.entity.UserEntity; import com.govmade.modules.system.service.UserService; /** * 认证 * * @author Fred * @email fangtaosh@qq.com * @date 2018年8月6日 */ @Component public class OAuth2Realm extends AuthorizingRealm { @Autowired private UserService userService; /** * 授权(验证权限时调用) */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { UserEntity ue = (UserEntity) principals.getPrimaryPrincipal(); Long userId = ue.getId(); // 用户权限列表 // Set<String> permsSet = shiroService.getUserPermissions(userId); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // info.setStringPermissions(permsSet); return info; } /** * 认证(登录时调用) */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); String password = new String((char[]) token.getCredentials()); Map<String, Object> params = Maps.newHashMap(); params.put("username", username); UserEntity ue = userService.queryOne(params); // 账号不存在 if (null == ue) { throw new UnknownAccountException("账号或密码不正确"); } // 密码错误 if (!password.equals(ue.getPassword())) { throw new IncorrectCredentialsException("账号或密码不正确"); } // 账号锁定 if (Constant.STATE_LOCK == ue.getState()) { throw new LockedAccountException("账号已被锁定,请联系管理员"); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(ue, username, getName()); return info; } }