修改Realm中授权方法查询登录人的权限
第一步:修改realm的授权方法
package com.itheima.bos.service;
import java.util.List;
import javax.annotation.Resource;
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.UsernamePasswordToken;
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 com.itheima.bos.domain.system.Permission;
import com.itheima.bos.domain.system.Role;
import com.itheima.bos.domain.system.User;
public class BosLoginRealm extends AuthorizingRealm{
@Resource
private IUserService userService;
@Resource
private IPermissionService permissionService;
@Resource
private IRoleService roleService;
/**
* 授权方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalcollection) {
//1.获取当前登录用户
User user = (User) principalcollection.getPrimaryPrincipal();
//2.根据当前用户查询该用户的权限和角色
//2.1查询用户的权限
List<Permission> permList = permissionService.findPermsByUser(user);
//2.2查询用户的角色
List<Role> roleList = roleService.findRolesByUser(user);
//3.将权限和角色授予当前登录用户
SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();
if(null != permList && permList.size() > 0){
//有权限
for(Permission perm : permList){
sai.addStringPermission(perm.getKeyword());
}
}
if(null != roleList && roleList.size() > 0){
//有角色
for(Role role : roleList){
sai.addRole(role.getKeyword());
}
}
//权限数据不足,先进行静态授权
return sai;
}
/**
* 认证方法
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationtoken)
throws AuthenticationException {
//1.根据用户名查询用户对象
UsernamePasswordToken upt = (UsernamePasswordToken)authenticationtoken;
String username = upt.getUsername();
User user = userService.findByUsername(username);
if(null != user){
//2.查询到用户,通过AuthenticationInfo将用户对象和密码返回给安全管理器,安全管理器会自动校验密码,
// 校验通过,正常执行,
// 校验不通过,直接抛异常
//参数1:可以放任意对象,该对象可以在任何位置获取到,一般放用户对象
//参数2:放要校验的密码
//参数3:当前realm的名称
return new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
}
//3.查询不到用户,直接返回null给安全管理器,安全管理会认为用户不存在,直接抛异常
return null;
}
}
5.2第二步:扩展Permission和Role的service
@Override
public List<Permission> findPermsByUser(User user) {
//1.判断是否是admin,超级管理员
if("admin".equals(user.getUsername())){
//2.是,查询所有权限数据
return permissionRepository.findAll();
} else {
//3.不是,根据用户id查询该用户的权限
return permissionRepository.findPermsByUser(user.getId());
}
}
@Query("select p from Permission p join p.roles r join r.users u where u.id=?1")
List<Permission> findPermsByUser(Integer id);
要根据id查询permission,查看permission与user的关系 这是query查询方式 原生方式:
-------------------------------------------------
@Override
public List<Role> findRolesByUser(User user) {
// 1.判断是否是admin,超级管理员
if ("admin".equals(user.getUsername())) {
// 2.是,查询所有角色数据
return roleRepository.findAll();
} else {
// 3.不是,根据用户id查询该用户的角色
return roleRepository.findRolesByUser(user.getId());
}
}
@Query("select r from Role r join r.users u where u.id=?1")
List<Role> findRolesByUser(Integer id);