修改Realm中授权方法查询登录人的权限

修改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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值