史郎を述べ、最初に導入さ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);
}