日常提交

This commit is contained in:
wu xiangkai
2022-10-14 19:24:59 +08:00
parent 7e5eec2677
commit 9aca3a3e1e

View File

@@ -68,6 +68,80 @@ if ( subject.hasRole(“administrator”) ) {
} else { } else {
//grey-out the button? //grey-out the button?
} }
```
> 通过role来实现权限认证可能会存在问题 // 通过如下代码,可以实现权限分配而不是角色检测
if ( subject.isPermitted(user:create) ) {
//show the Create User button
} else {
//grey-out the button?
}
```
权限控制甚至支持非常细粒度的权限,譬如实例级别的权限控制。
```java
// 如下代码检测用户是否拥有删除jsmith用户的权限
if ( subject.isPermitted(user:delete:jsmith) ) {
//delete the jsmith user
} else {
//dont delete jsmith
}
```
和Authentication类似Authorization也会进入SecurityManager并且通过一个或者多个Realm来决定是否允许访问。
**根据需要Realm既会响应Authentication过程也会响应Authority过程**
## Session Management
Apache提供了一致的会话管理在任何类型和架构的程序中都可以使用该Session API从小型的守护进程到大型集群web应用都可以使用。
并且Shiro提供的Session API是容器无关的在任何容器环境下Session API都相同。Shiro结构也支持可插入的session存储可以将session存储在企业缓存、关系型数据库或者nosql中。
Shiro Seesion的另一个好处是Shiro Session可以在不同技术实现的客户端之间进行共享譬如Swing桌面客户端可以和web客户端一起加入同一个应用会话用户同时使用swing客户端和web客户端时很有用
```java
/**
* 用户获取Session
*/
// 如果当前用户存在会话,则获取已存在会话,
// 如果当前用户不存在会话,则创建新的会话
Session session = subject.getSession();
// 接受一个boolean值该boolean值标识如果当前用户不存在会话是否创建一个新的会话
Session session = subject.getSession(boolean create);
```
### Shiro Session可在任何应用中使用
```java
Session session = subject.getSession();
session.getAttribute(key, someValue);
Date start = session.getStartTimestamp();
Date timestamp = session.getLastAccessTime();
session.setTimeout(millis);
```
## Shiro加密
Shiro加密是独立于用户Subject故而Shiro加密可以独立于Subject使用。
Shiro加密主要关注于如下两个模块
- hash加密又名消息摘要message digest
- ciphers加密
### shiro hash
在Shiro hash中如果想要快速计算文件的MD5值可以通过如下方式快速计算
```java
String hex = new Md5Hash(myFile).toHex();
```
在shiro hash中如果想要对密码进行sha-512进行hash操作并且对结果进行base64编码成可打印字符串可以进行如下操作
```java
String encodedPassword =
new Sha512Hash(password, salt, count).toBase64();
```
Shiro框架在很大程度上简化了hash和编码。
### Shiro Ciphers
Ciphers是一种算法可以通过指定的key将加密后的数据还原到加密之前不同于hash操作hash操作通常是不可逆的。通常用Ciphers来保证数据传输时的安全防止数据在传输时被窥探。
Shiro通过引入CipherService API来简化加密的流程**CipherService是一个简单无状态并且线程安全的API可以对应用数据进行加密或者解密操作。**
```java
// Shiro CipherService对数据进行加密操作
AesCipherService cipherService = new AesCipherService();
cipherService.setKeySize(256);
//create a test key:
byte[] testKey = cipherService.generateNewKey();
//encrypt a files bytes:
byte[] encrypted =
cipherService.encrypt(fileBytes, testKey);
```
## Shiro框架的Web支持