shiro-身份授权流程、案例

本文详细介绍了Shiro框架的身份授权流程,涉及如何通过Subject进行权限检查,通过数据库查询用户角色和权限,并展示了查询数据库的伪代码。重点讲解了如何通过`isPermitted`和`hasRole`接口验证用户权限和角色。
一、身份授权流程
  1. 首先调用Subject.isPermitted/hasRole接口,委托给SecurityManager.
  2. SecurityManager接着会委托给内部组件Authorizer.
  3. Authorizer再将其请求委托给我们的Realm去做,Realm才是真正干活的.
  4. realm将用户请求的参数封装成权限对象,再从我们重写的doGetAuthorizationInfo方法中获取从数据库中查询到的权限集合.
  5. Realm将用户传入的权限对象,与数据库查询出来的权限对象进行比较。如果用户掺入的权限对象在数据库中存在,侧返回true,否则返回false。
    前提:进行授权操作的前提,用户必须通过认证。
二、案例
1.首先模拟数据库查询数据
 /**
     * 通过用户名查询角色列表
     * @param loginName
     * @return
     */
    List<String> findRoleByLoginName(String loginName);

    /**
     * 通过用户名查询资源列表
     * @param loginName
     * @return
     */
    List<String> findPermissionByLoginName(String loginName);
/**
     * 通过用户名查询角色列表
     * 伪代码
     * @param loginName
     * @return
     */
    @Override
    public List<String> findRoleByLoginName(String loginName) {
        List<String> list = Lists.newArrayList();
        list.add("admin");
        list.add("dev");
        return list;
    }

    /**
     * 通过用户名查询资源列表
     * 伪代码
     * @param loginName
     * @return
     */
    @Override
    public List<String> findPermissionByLoginName(String loginName) {
        List<String> list = Lists.newArrayList();
        list.add("order.add");
        list.add("order.insert");
        list.add("order.delete");
        return list;
    }
2.编写授权,认证的代码在之前的文章里
/**
     * 鉴权
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //一、拿到用户凭证
        String loginName = (String)principalCollection.getPrimaryPrincipal();
        //二、从数据库中查询对应的角色和权限
        SecurityServiceImpl service = new SecurityServiceImpl();
        List<String> roles = service.findRoleByLoginName(loginName);
        List<String> permissions = service.findPermissionByLoginName(loginName);
        //三、构建资源校验对象
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        simpleAuthorizationInfo.addRoles(roles);
        simpleAuthorizationInfo.addStringPermissions(permissions);
        return simpleAuthorizationInfo;
    }
         //导入ini配置创建工厂
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //工厂构建安全管理器
        SecurityManager securityManager = factory.getInstance();
        //使用工具生效安全管理器
        SecurityUtils.setSecurityManager(securityManager);
        //使用工具获取subject的主体
        Subject subject = SecurityUtils.getSubject();
        //构建账号密码
        UsernamePasswordToken passwordToken = new UsernamePasswordToken("zhangSan", "123");
        //使用subject主体去登录
        subject.login(passwordToken);
        //打印登录信息
        System.out.println("登录结果" + subject.isAuthenticated());

        //校验当前用户是否拥有管理员的权限
        boolean admin = subject.hasRole("admin");
        System.out.println("是否用户管理员角色"+admin);
        //校验当前用户没有的角色
        try {
            subject.checkRole("coder");
            System.out.println("当前用户有coder这个角色");
        } catch (AuthorizationException e) {
            System.out.println("当前用户没有coder这个角色");
        }
        //校验当前用户的权限信息
        System.out.println("当前用户是否有查看订单的权限"+ subject.isPermitted("order:list"));
        //校验当前用户没有的权限
        try {
            subject.checkPermission("order:update");
            System.out.println("当前用户有修改权限");
        } catch (AuthorizationException e) {
            System.out.println("当前用户没有修改权限");
        }
执行结果

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值