あなたを取るシークレット史郎(A)

史郎を述べ、最初に導入さRBACを導入していました

RBACの説明:

  RBACの役割ベースのアクセス制御(ロールベースのアクセス制御)においてRBAC、役割、これらのロールを取得するために適切な役割と権限のメンバーになることにより、ユーザに関連付けられた権限。これは、大幅に管理者権限を簡素化します。管理のようなレベルでは、ロールに付与された権限相互に依存しているが、役割は、ユーザーにデザインは、明確な管理が容易で、そうする許可を与えます。

RBACモデルの内部には、3つの基本要素があります:ユーザー、ロールと権限。

大幅に説明する前に、管理権限を容易にし、ユーザーと権限の論理的な分離を達成するためにユーザーを制御するために、役割に付与されたロールRBACの権限とユーザー権限を定義することにより、最初のいくつかの用語を紹介:

利用者(ユーザ):各ユーザーは固有の識別UID、異なる役割および許可を有しています

役割(ロール):異なる役割は、異なるアクセス許可を持っています

パーミッション(権限):アクセス

ユーザ - ロールマッピング:ユーザとロールの間の関係をマッピング

役割 - 権限マッピング:ロールと権限の間のマッピング

ユーザー認証、ユーザー認証)::(著作権管理は、2つの部分から構成され

  限り管理システムに参加するユーザーとして、一般的に、彼らは、ユーザーが安全規則に従ってリソースにアクセスできる権限を与えてきたことを実現するために、システムへのユーザーアクセスの制御を達成するために、著作権管理著作権管理を持っています。

ユーザー認証:

 

Keyオブジェクト:

件名:ボディは、ユーザーとして理解、プログラムは、可能なシステムリソースにアクセスするために行かなければならないことがあり、システムは、対象を認証する必要があります。

 

プリンシパル:識別情報、通常は一人の被験者が、いくつかの識別可能な情報であるが、一次識別情報(一次主)を有しています

 

資格:資格情報は、パスワード、証明書、指紋ことができます。

 

概要:認証体中にIDと認証情報を提供する必要があります。

ユーザー認証:

ユーザー認証は、単にアクセス制御、リソースへのユーザーアクセスを制御するためのシステムの後を介してユーザ認証として理解、ユーザーがアクセスする前に、リソースへのアクセス権を持っています。

ユーザーの承認プロセス:

主要なオブジェクト

 

誰が何を(どの)に操作方法をした:認可は、理解の過程です。

 

誰:すなわち主被写体、認証後のアクセス制御システムの対象。

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);

}

おすすめ

転載: www.cnblogs.com/anonymityning/p/11986563.html