ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

带你揭秘Shiro(一)

2019-12-04 23:51:30  阅读:247  来源: 互联网

标签:用户 shiro apache org 权限 揭秘 Shiro subject


提到Shiro,不得不先介绍RBAC介绍

RBAC介绍:

  RBAC是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。

在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限。

RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离,极大地方便了权限的管理,在讲解之前,先介绍一些名词:

User(用户):每个用户都有唯一的UID识别,并被授予不同的角色

Role(角色):不同角色具有不同的权限

Permission(权限):访问权限

用户-角色映射:用户和角色之间的映射关系

角色-权限映射:角色和权限之间的映射

权限管理:(包含两部分:用户认证,用户授权)

  只要有用户参与的管理系统一般都有权限管理,权限管理实现对用户访问系统的控制,按照安全规则实现用户可以访问自己被授权的资源。

用户认证:

 

关键对象:

subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份认证。

 

principal:身份信息,通常是唯一的,一个主体还有多个身份信息,但是都有一个主身份信息(primary principal)

 

credential:凭证信息,可以是密码 、证书、指纹。

 

总结:主体在进行身份认证时需要提供身份信息和凭证信息。

用户授权:

用户授权,简单理解为访问控制,在用户认证通过后,系统对用户访问资源进行控制,用户具有资源的访问权限方可访问。

用户授权流程:

关键对象

 

授权的过程理解为:who对what(which)进行how操作。

 

who:主体即subject,subject在认证通过后系统进行访问控制。

what(which):资源(Resource),subject必须具备资源的访问权限才可访问该 资源。资源比如:系统用户列表页面、商品修改菜单、商品id为001的商品信息。

 

资源分为资源类型和资源实例

系统的用户信息就是资源类型,相当于java类。

系统中id为001的用户就是资源实例,相当于new的java对象。

 

how:权限/许可(permission) ,针对资源的权限或许可,subject具有permission访问资源,如何访问/操作需要定义permission,权限比如:用户添加、用户修改、商品删除。

shiro介绍

shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权,功能强大、且 简单、灵活,且不跟任何的框架或者容器绑定,可以独立运行。

spring中有spring security (原名Acegi),是一个权限框架,使用起来很方便,和spring依赖过于紧密。

 

shiro架构

 

shiro入门

 

1.创建springboot工程并导入依赖

将shiro的依赖加入项目就可以使用shiro提供的功能了,shiro-core是核心包必须选用,还提供了与web整合的shiro-web、与spring整合的shiro-spring以及缓存shiro-ehcache。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.0</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.4.0</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.4.0</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>
    <version>1.2.3</version>
</dependency>

2.在resources目录下创建shiro.ini文件,IEDA需要安装*.ini并重启方可生效

#对用户的配置
[users]
#对用户的用户名和密码的配置
jack=123
tom=456

3.创建测试类

package com.wn.authentication;

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.junit.Test;

public class AuthenticationDemo {

    // 用户登陆和退出
    @Test
    public void testLoginAndLogout() {

        // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                "classpath:shiro.ini");

        // 创建SecurityManager
        SecurityManager securityManager = factory.getInstance();

        // 将securityManager设置当前的运行环境中
        SecurityUtils.setSecurityManager(securityManager);

        // 从SecurityUtils里边创建一个subject
        Subject subject = SecurityUtils.getSubject();

        // 在认证提交前准备token(令牌)
        // 这里的账号和密码 将来是由用户输入进去
        UsernamePasswordToken token = new UsernamePasswordToken("jack", "123");

        try {
            // 执行认证提交
            subject.login(token);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 是否认证通过
        boolean isAuthenticated = subject.isAuthenticated();

        System.out.println("是否认证通过:" + isAuthenticated);

        // 退出操作
        subject.logout();

        // 是否认证通过
        isAuthenticated = subject.isAuthenticated();

        System.out.println("是否认证通过:" + isAuthenticated);

    }
}

带上图片:第二测试的是关闭的时候。

使用realm:

1.创建自定义realm

package com.wn.realm;

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.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class realmDemo extends AuthorizingRealm {

    private String realmName  = "realmDemo";

    //认证
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken 
authenticationToken) throws AuthenticationException {
//从token中取出用户信息
        //用户名,身份信息
        String principal = (String)authenticationToken.getPrincipal();
        System.out.println(principal);
        //密码,凭证
        Object credentials = authenticationToken.getCredentials();
//类型转化
        String password = new String((char[]) credentials);
        System.out.println(password);

        if("jack".equals(principal) && "123".equals(password)){

            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal,password,realmName);

            return simpleAuthenticationInfo;
        }

        return null;
    }

    //授权
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }
}

2.在resource目录下创建shiro-realm.ini(注意:realm路径别配置错了)

[main]
#自定义realm
realmDemo=com.qf.realm.realmDemo
#将realm设置到securityManager
securityManager.realms=$realmDemo

3.在AuthenticationDemo类中添加方法进行测试

// 用户登陆和退出
@Test
public void testRealm() {

// 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:realm.ini");

// 创建SecurityManager
SecurityManager securityManager = factory.getInstance();

// 将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);

// 从SecurityUtils里边创建一个subject
Subject subject = SecurityUtils.getSubject();

// 在认证提交前准备token(令牌)
// 这里的账号和密码 将来是由用户输入进去
UsernamePasswordToken token = new UsernamePasswordToken("jack", "123");

try {
// 执行认证提交
subject.login(token);
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

// 是否认证通过
boolean isAuthenticated = subject.isAuthenticated();

System.out.println("是否认证通过:" + isAuthenticated);

// 退出操作
subject.logout();

// 是否认证通过
isAuthenticated = subject.isAuthenticated();

System.out.println("是否认证通过:" + isAuthenticated);

}

标签:用户,shiro,apache,org,权限,揭秘,Shiro,subject
来源: https://www.cnblogs.com/anonymityning/p/11986563.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有