美文网首页
Shiro的角色、权限ini配置

Shiro的角色、权限ini配置

作者: tingshuo123 | 来源:发表于2018-08-24 15:57 被阅读18次

    名词解释

    授权,也叫访问控制,即在应用中控制谁能访问哪些资源,关于授权有下面几个需要了解的对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)

    • 主体(Subject):访问应用的用户,在 Shiro 中使用 Subject 代表该用户。
    • 资源(Resource):在应用中用户可以访问的任何东西,用户授权
    • 权限(Permission):权限表示在应用中用户能不能访问、操作某个资源
    • 角色代表了操作集合,可以理解为权限的集合, 不同的角色拥有一组不同的权限。如普通用户,管理员用户都是角色,用户会拥有所属角色拥有的所有权限。

    角色

    通过ini文件中配置角色
    shiro-role.ini:

    [users]
    zhang=123,role1,role2
    wang=123,role1
    

    由上可知为用户添加角色的规则就是:"用户名=密码,角色1,角色2"

    测试用例:
    基础测试类 BaseTest

    package chapter3;
    
    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;
    import org.apache.shiro.util.ThreadContext;
    import org.junit.After;
    
    public class BaseTest {
    
        @After
        public void tearDown() {
            ThreadContext.unbindSubject();
        }
        
        // 验证用户
        protected void loing(String configFile, String username, String password) {
            // 获取SecurityManager工厂
            Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(configFile);
    
            // 获通过工厂获取SecurityManager实例
            SecurityManager securityManager = factory.getInstance();
    
            // 将实例绑定给SecurityUtils
            SecurityUtils.setSecurityManager(securityManager);
    
            // 获取Subject
            Subject subject = SecurityUtils.getSubject();
    
            // 创建Token
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    
            // 登录(验证用户)
            try {
                subject.login(token);
            } catch (AuthenticationException e) {
                // 验证失败
                e.printStackTrace();
            }
    
            if (subject.isAuthenticated()) {
                System.out.println("登录成功!!!");
            }
        }
        
    
        // 获取subject对象
        public Subject subject() {
            return SecurityUtils.getSubject();
        }
    }
    

    后面的测试类都会继承它。

    角色测试

    public class RoleTest extends BaseTest{
    
        
        @Test
        public void testHasRole() {
            String configFile = "classpath:shiro-role.ini";
            String username = "zhang";
            String password = "123";
            
            this.loing(configFile, username, password);
            
            // 判断是否属于单个角色
            Assert.assertTrue(this.subject().hasRole("role1"));
            // 判断是否拥有多个角色
            Assert.assertTrue(this.subject().hasAllRoles(Arrays.asList("role1", "role2")));
        }
    }
    

    权限

    通过ini文件中配置角色及权限

    [users]
    zhang=123,role1,role2
    wang=123,role1
    [roles]
    role1=user:create,user:update
    role2=user:create,user:delete
    

    权限测试

    public class PerdmissionTest extends BaseTest {
        
        @Test
        public void testIsPermitted() {
            
            this.loing("classpath:shiro-primission.ini", "zhang", "123");
            // 判断是否拥有单个权限
            Assert.assertTrue(this.subject().isPermitted("user:create"));
            // 判断是否拥有多个个权限
            Assert.assertTrue(this.subject().isPermittedAll("user:create", "user:update"));
        }
    }
    

    Shiro有默认实现的Realm,也可以自己定义,上面这样的是基于角色的访问控制,还有基于资源的访问访问控制。

    相关文章

      网友评论

          本文标题:Shiro的角色、权限ini配置

          本文链接:https://www.haomeiwen.com/subject/wskbiftx.html