著作権管理の簡単な使用-shiro
記事のディレクトリ
著作権管理
1.著作権管理とは何ですか
著作権管理は、安全管理のカテゴリに属するだけでそのユーザーのアクセス制御を意味し、
2.アイデンティティとは何ですか
ユーザーが認証と呼ばれるこのプロセスの正当な利用者であるかどうかを確認します。
最も一般的には、ユーザー名とパスワードによる簡単な認証であるかのユーザー名とデータベースのパスワードが存在するので、あなたは法的または法的ではないこと
3、ユーザー名とパスワードの認証プロセス
4、キーオブジェクト
- 件名:件名
- 彼らは先に言及する方法でシステム、手順、認証へのユーザーのアクセスが対象となります
- 単に認証に起こっている人、置くこのテーマは誰です
- Primcipal:アイデンティティ
- 件名アイデンティティがアイデンティティ認証の上で、アイデンティティは一意である必要があります
- 一意性:電話番号、ユーザー名、電子メールアドレス
- 単にあなたがよくを認証するために持って来る情報は、これは何Primcipalであることが確認されました
- 資格:資格情報
- パスワード、セキュリティ情報(トークン)
5.承認プロセスとは何ですか
6、基本的なアクセス許可モデル
アクセス許可モデルは何ですか?
簡単に言えば、モデルは日常的に相当し、ルーチンは単にプロジェクトがこのシステムを使用するユーザの異なるアイデンティティ(役割)の様々な遭遇した場合、我々はプロジェクトを行っていることを意味するだけでなく、それらのユーザーの異なるアイデンティティデータベースへの異なるアクセス権を持っているとき、私たちは、このルーチンを設定するとき
モールプロジェクト:プラットフォームの買い手と売り手====>ロール
また、ユーザーは、異なるアクセス権の異なるアイデンティティを持っています
役割は、実際に権利のセットです
资源:官方的解释:一切能够被计算机识别的图片、文字、文件等等都成为资源
项目开发中所指的这个资源:指的是页面上的所有的按钮、图片、文字、超链接。。。
7、通用的权限模型
7.1、表里面到底都有哪些字段
用户表
用户id 用户名 ....
角色表
角色id 角色名字 角色描述
用户角色表
用户id 角色id
权限资源表
权限资源id 权限名字 权限的描述 type(per|res) resName resPath 显示区域的编码
角色权限表
角色id 权限的id
8、目前市场上通用的权限管理框架
shiro Spring Security OAuth2
Spring Security 这个框架是有依赖性的 Spring
OAuth2:第三方登陆、公众平台
shiro:这个框架有个优点,没有框架的依赖、任何平台都可以用
shiro的简单使用
9、shiro是什么
简单说shiro就是一个负责授权和认证的框架
- Apache Shiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都可拿来使用。
- Shiro将目标集中于Shiro开发团队所称的“四大安全基石”-认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography):
- 认证(Authentication):用户身份识别。有时可看作为“登录(login)”,它是用户证明自己是谁的一个行为。
- 授权(Authorization):访问控制过程,好比决定“认证(who)”可以访问“什么(what)”.
- 会话管理(SessionManagement):管理用户的会话(sessions),甚至在没有WEB或EJB容器的环境中。管理用户与时间相关的状态。
- 加密(Cryptography):使用加密算法保护数据更加安全,防止数据被偷窥。
10、shiro能干什么
认证、授权、Cache的管理、Session的管理、rememberMe功能的实现、登陆、退出…
11、shiro的整体架构是什么
11.1、shiro中常见的名词解释
- 件名:あるユーザ(ユーザプログラム)を着陸し、認証機関
- プリンシパル:ユーザ名(ユーザ情報も中にカプセル化されてもよいです)
- 資格:パスワード
- トークン:認証用トークン(ユーザ名+パスワードパッケージ)----カプセル化されたオブジェクト
- このオブジェクトは、このトークンの前と後に分離されていません
- セキュリティマネージャ:セキュリティマネージャが(史郎だけフレームワークを使用して、オブジェクトが不可欠です)
- オーセンティケータ:オーセンティケータ(主に、単にそれは本人確認の着陸をする時間だということを教えて、ユーザ認証を行うには)
- Authrizer:承認者(簡単に言えば、許可されたユーザのために使用されています)
- レルムは:データベースとユーザーの認証と認可と相互作用オブジェクト(そこをやってトークンデータベースクエリにパッケージ化して、認証および承認からデータを取っています)
12、史郎最初のhelloworldプログラム
12.1、ガイドパッケージ
<!--导入shiro的包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.3.2</version>
</dependency>
12.2、リソースデータベースシミュレーションでファイルを作成します
shiro.ini - >のみ.iniファイルの終わりで、セットのプロパティへの道としての道を読んでのアイデア、または有効になりません
[users]
kongming=123
dan=456
12.3、ユーザ認証を完了するために、書き込みテストコード
/**
* 测试shiro是否正常使用
*/
@Test
public void shiro1() {
// 获取安全管理器工厂
IniSecurityManagerFactory iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 通过安装管理器工厂获取安全管理器
SecurityManager securityManager = iniSecurityManagerFactory.createInstance();
// 将安全管理器设置到运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 获取当前操作的主体(subject)
Subject subject = SecurityUtils.getSubject();
// 此处的 用户名和密码,是由前端传过来的,此处直接赋值,模拟测试数据
// 利用用户名和密码,创建token
UsernamePasswordToken token = new UsernamePasswordToken("kongming", "123");
// 传递token进行验证
subject.login(token);
// 输出用户认证状态
System.out.println("用户的认证状态:" + subject.isAuthenticated());
// 用户退出
subject.logout();
// 再次打印用户认证状态
System.out.println("用户的认证状态:" + subject.isAuthenticated());
}
/*
认证成功:打印出---》 true false
认证失败:抛出异常:org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - kongming, rememberMe=false] did not match the expected credentials.
*/
13、カスタムレルムの実装
13.1、輸入依存関係
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
/*
出现这个错误的原因是: 缺少日志支持的依赖,需要导入 log4j 和 commons-logging 这2个依赖
*/
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.10</version>
</dependency>
13.2、エンティティクラスを作成します
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String username;
private String password;
}
13.3、カスタムレルム
UserRealm.java
package com.fu.shiro.realm;
import com.fu.shiro.pojo.User;
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 UserRealm extends AuthorizingRealm {
@Override
public String getName() {
return "UserRealm";
}
/**
* 认证
* @param authenticationToken 令牌
* @return 返回认证信息
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// 1. 通过token获取用户名
String username = (String) authenticationToken.getPrincipal();
// 2. 通过用户名到数据库查询用户信息
// User user = userService.getUserByName(user);
// 如果查不到用户,直接返回 null,这里模拟 if(null == user)
if (!username.equals("kongming")) {
return null;
}
// 此处模拟已经查询到用户信息
User user = new User("kongming", "123");
// 3. 返回认证信息对象
return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
}
/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
}
13.4構成の書込み
史郎-realm.iniカスタム実装クラス指定されたレルム
[main]
customRealm=com.fu.shiro.realm.UserRealm
securityManager.realms=$customRealm
13.5、テスト
/**
* 测试 使用自定义realm完成身份认证
*/
@Test
public void shiro2() {
// 获取安全管理器工厂
IniSecurityManagerFactory iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");
// 通过安装管理器工厂获取安全管理器
SecurityManager securityManager = iniSecurityManagerFactory.createInstance();
// 将安全管理器设置到运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 获取当前操作的主体(subject)
Subject subject = SecurityUtils.getSubject();
// 此处的 用户名和密码,是由前端传过来的,此处直接赋值,模拟测试数据
// 利用用户名和密码,创建token
UsernamePasswordToken token = new UsernamePasswordToken("kongming", "123");
// 传递token进行验证
subject.login(token);
// 输出用户认证状态
System.out.println("用户的认证状态:" + subject.isAuthenticated());
// 用户退出
subject.logout();
// 再次打印用户认证状态
System.out.println("用户的认证状态:" + subject.isAuthenticated());
}