UserRealm.java 3.0 KB
package com.framework.shiro;

import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.annotation.Resource;

import org.apache.shiro.SecurityUtils;
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.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;

import com.google.common.collect.Sets;
import com.agent.entity.system.PermissionEntity;
import com.agent.entity.system.UserEntity;
import com.agent.service.system.RoleService;
import com.agent.service.system.UserService;

public class UserRealm extends AuthorizingRealm{
	
	@Resource
	private UserService userService;
	
	@Resource
	private RoleService roleService;
	

	/**
	 * 返回当前subject的授权信息
	 * 交由shiro的Authorizer鉴权
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
		String loginAccount = (String) principals.getPrimaryPrincipal();
		UserEntity user = userService.findByLoginaccount(loginAccount);
		//System.out.println("user role id"+user.getRole().getId()+" role name:"+user.getRole().getRolename()+" :" + 
		//user.getRole().getRolecode()
		//		);
		
		Set<String> roles = Sets.newHashSet(user.getRole().getRolecode());//  user.getRole().getId().toString());
		authorizationInfo.setRoles(roles);
		//查询权限字符串
		List<PermissionEntity> list = roleService.findAllPermisstionByRole(user.getRole());
		Set<String> permisstions = Sets.newTreeSet();
		for(PermissionEntity permisstion:list) {
			
			permisstions.add(permisstion.getMenu().getPermission());
		}
		authorizationInfo.setStringPermissions(permisstions);
		return authorizationInfo;
	}

	/**
	 * 返回用户身份认证信息
	 * 交由shiro的Authenticator验证
	 * 
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		String loginAccount = (String) token.getPrincipal();
		UserEntity user = userService.findByLoginaccount(loginAccount);
		if(user==null){
			throw new UnknownAccountException();
		}
		user.setLastLoginTime(new Date());
		userService.save(user);
		Subject subject = SecurityUtils.getSubject();
		SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getLoginaccount(),user.getPassword(),getName());
		//创建会话
        subject.getSession().setAttribute("user", user);
        //System.out.println("role:"+user.getRole().getId()+" name:"+user.getRole().getRolename());
        //缓存用户菜单权限
        subject.getSession().setAttribute("menuList", roleService.findAllFunctionByRole(user.getRole()));
		
        return authenticationInfo;
	}

}