JwtRealm.java
package com.mycim.webapp.secutiry.shiro.realm;
import com.mycim.framework.context.spring.SpringContext;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.server.base.service.BaseService;
import com.mycim.server.security.service.SecurityService;
import com.mycim.valueobject.security.User;
import com.mycim.webapp.secutiry.jwt.JwtUtils;
import com.mycim.webapp.secutiry.jwt.token.JwtToken;
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.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* @program: mycim-module
* @description:
* @author: pinyan.song
* @create: 2019-06-26 10:05
**/
@Service
public class JwtRealm extends AuthorizingRealm {
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof JwtToken;
}
/**
* 校验权限
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SecurityService securityService = SpringContext.getBean(SecurityService.class);
BaseService baseService = SpringContext.getBean(BaseService.class);
JwtToken jwtToken = new JwtToken(principals.toString());
User user = securityService.getUser(jwtToken.getUserRrn());
// 获取role
Collection<Long> roleRrns = securityService.getUserWithGroupGrantRoleList(user.getInstanceRrn());
Iterator<Long> roles = roleRrns.iterator();
String roleIdString = "";
while (roles.hasNext()) {
Long role = roles.next();
String roleId = baseService.getNamedObjectId(role.longValue());
if (!StringUtils.equalsIgnoreCase("N/A", roleId)) {
roleIdString += (roleId + ",");
}
}
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
simpleAuthorizationInfo.addRole(roleIdString);
Set<String> permission = new HashSet<>(Arrays.asList(roleIdString.split(",")));
simpleAuthorizationInfo.addStringPermissions(permission);
return simpleAuthorizationInfo;
}
/**
* 校验登录
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
JwtToken jwtToken = new JwtToken(token.getCredentials().toString());
String userRrn = jwtToken.getUserRrn().toString();
if (StringUtils.isEmpty(userRrn)) {
throw new AuthenticationException("token invalid");
}
if (!JwtUtils.verify(jwtToken)) {
throw new AuthenticationException("Username or password error");
}
return new SimpleAuthenticationInfo(jwtToken.getToken(), jwtToken.getToken(), "JwtRealm");
}
}