zoukankan      html  css  js  c++  java
  • Shiro学习笔记 三(认证授权)

    第一种首先基于角色的权限控制

    1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类

    还是首先看一下目录结构

    主要用到文件  

    首先贴一下工具类的方法

    package com.zuoyan.utils;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    /**
     * 将获取当前用户封装成一个方法,方便每次调用
     * @author zuoyan
     *
     */
    public class ShiroUtil {
    
        /**
         * 获取当前用户  1.配置文件的位置 2.用户得账号 3.用户的密码
         * @param configFile
         * @param userName
         * @param password
         * @return
         */
        public static Subject login(String configFile,String userName,String password){
            // 读取配置文件,初始化SecurityManager工厂
            Factory<SecurityManager> factory=new IniSecurityManagerFactory(configFile);
            // 获取securityManager实例
            SecurityManager securityManager=factory.getInstance();
            // 把securityManager实例绑定到SecurityUtils
            SecurityUtils.setSecurityManager(securityManager);
            // 得到当前执行的用户
            Subject currentUser=SecurityUtils.getSubject();
            // 创建token令牌,用户名/密码
            UsernamePasswordToken token=new UsernamePasswordToken(userName, password);
            try{
                // 身份认证
                currentUser.login(token);    
                System.out.println("身份认证成功!");
            }catch(AuthenticationException e){
                e.printStackTrace();
                System.out.println("身份认证失败!");
            }
            return currentUser;
        }
    }

    shiro_role.int配置文件中的内容

    [users]
    zuoyan=zuoyan123,role1,role2,role3
    java1234=123456,role1,role2
    jack=123,role1

    还有最后就是在测试方法中调用的代码

    RoleTest.java

    package com.zuoyan.shiro;
    
    
    
    import java.util.Arrays;
    
    import org.apache.shiro.subject.Subject;
    import org.junit.Test;
    
    import com.zuoyan.utils.ShiroUtil;
    
    
    public class RoleTest {
    
        @Test
        public void testHasRole() {
            Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "zuoyan", "zuoyan123");
            // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
            System.out.println(currentUser.hasRole("role1")?"有role1这个角色":"没有role1这个角色");
            boolean []results=currentUser.hasRoles(Arrays.asList("role1","role2","role3"));
            System.out.println(results[0]?"有role1这个角色":"没有role1这个角色");
            System.out.println(results[1]?"有role2这个角色":"没有role2这个角色");
            System.out.println(results[2]?"有role3这个角色":"没有role3这个角色");
            System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2"))?"role1,role2这两个角色都有":"role1,role2这个两个角色不全有");
            
            currentUser.logout();
        }
    
        @Test
        public void testCheckRole() {
            Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "java1234", "123456");
            // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
            currentUser.checkRole("role1");
            //这两个方法是一样的如果没有通过就会报错
            currentUser.checkRoles(Arrays.asList("role1","role2"));
            currentUser.checkRoles("role1","role2","role3");
            
            currentUser.logout();
        }
    }

    这种情况是认证成功的效果

     如果要是用户的认证都没有通过的话,那么向下执行就会显示没有XXX这个角色

    --------------------------------------------------------------下面学习授权-------------------------------------------------------------

    在资源文件下创建    shiro_permission.ini

    文件中的内容为:

    [users]
    java1234=123456,role1,role2
    jack=123,role1
    [roles]
    role1=user:select
    role2=user:add,user:update,user:delete

    role1 角色只具有查找的权限   role2的角色可以进行  增 删  改

    新建一个测试类,就是测试角色权限的

    如下代码

    package com.zuoyan.shiro;
    
    import org.apache.shiro.subject.Subject;
    import org.junit.Test;
    
    import com.zuoyan.utils.ShiroUtil;
    
    public class PermissionTest {
        
        @Test
        public void testIsPermitted() {
            Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
            // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
            System.out.println(currentUser.isPermitted("user:select")?"有user:select这个权限":"没有user:select这个权限");
            System.out.println(currentUser.isPermitted("user:update")?"有user:update这个权限":"没有user:update这个权限");
            boolean results[]=currentUser.isPermitted("user:select","user:update","user:delete");
            System.out.println(results[0]?"有user:select这个权限":"没有user:select这个权限");
            System.out.println(results[1]?"有user:update这个权限":"没有user:update这个权限");
            System.out.println(results[2]?"有user:delete这个权限":"没有user:delete这个权限");
            System.out.println(currentUser.isPermittedAll("user:select","user:update")?"有user:select,update这两个权限":"user:select,update这两个权限不全有");
            
            currentUser.logout();
        }
    
        @Test
        public void testCheckPermitted() {
            Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
            // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
            currentUser.checkPermission("user:select");
            currentUser.checkPermissions("user:select","user:update","user:delete");
            currentUser.logout();
        }
    
    }

    运行效果图

     这次测试更换一个用户账号,权限比较小的,

    判断权限的语句 :currentUser.isPermitted (参数是用户的权限)

    返回值是bool类型的

    使用check的情况  

    如果不成功   就会抛出异常! 而且没有返回值

  • 相关阅读:
    板子们~缓慢更新
    Hello World!
    [SHOI2008]堵塞的交通traffic
    [JSOI2008]最大数
    [SCOI2005]扫雷
    [HAOI2007]上升序列
    [HAOI2007]理想的正方形
    [SCOI2003]字符串折叠
    [HAOI2008]移动玩具
    [BJOI2006]狼抓兔子
  • 原文地址:https://www.cnblogs.com/kangxinxin/p/7924174.html
Copyright © 2011-2022 走看看