发表于: 2017-12-23 21:50:21
1 535
今天完成的事:
请了半天假,没看多少。
暴力防破解
public class RetryLimitHashedCredentialsMatcher extends HashedCredentialsMatcher {
// 如在1个小时内密码最多重试5次,如果尝试次数超过5次就锁定1小时,1小时后可再次重试,如果还是重试失败,
// 可以锁定如1天,以此类推,防止密码被暴力破解。我们通过继承HashedCredentialsMatcher,
// 且使用Ehcache记录重试次数和超时时间。
private Cache<String, AtomicInteger> passwordRetryCache;
public RetryLimitHashedCredentialsMatcher(CacheManager cacheManager) {
passwordRetryCache = cacheManager.getCache("passwordRetryCache");
}
@Override
public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
String username = (String)token.getPrincipal();
//retry count + 1
AtomicInteger retryCount = passwordRetryCache.get(username);
if(retryCount == null) {
retryCount = new AtomicInteger(0);
passwordRetryCache.put(username, retryCount);
}
if(retryCount.incrementAndGet() > 5) {
//if retry count > 5 throw
throw new ExcessiveAttemptsException();
}
boolean matches = super.doCredentialsMatch(token, info);
if(matches) {
//clear retry count
passwordRetryCache.remove(username);
}
return matches;
}
}
整个用户控制5张表
user放基础信息
role放角色信息
userole放用户和角色的关系
permission放权限
rolepermssion放角色与权限关系
整个表群关系明确,但是问题来了,sql好像不太会,明天看看
明天计划的事:
准备小课堂。
问题:
收获:
Permission
字符串通配符权限
规则:“资源标识符:操作:对象实例 ID” 即对哪个资源的哪个实例可以进行什么操作。其默认支持通配符权限字符串,“:”表示资源/操作/实例的分割;“,”表示操作的分割;“*”表示任意资源/操作/实例。
1、单个资源单个权限
subject().checkPermissions("system:user:update");
用户拥有资源“system:user”的“update”权限。
2、单个资源多个权限
role41=system:user:update,system:user:delete
然后通过如下代码判断
subject().checkPermissions("system:user:update", "system:user:delete");
用户拥有资源“system:user”的“update”和“delete”权限。如上可以简写成:
ini 配置(表示角色4拥有 system:user 资源的 update 和 delete 权限)
role42="system:user:update,delete"
接着可以通过如下代码判断
subject().checkPermissions("system:user:update,delete");
通过“system:user:update,delete”验证“system:user:update, system:user:delete”是没问题的,但是反过来是规则不成立。
3、单个资源全部权限
ini 配置
role51="system:user:create,update,delete,view"
然后通过如下代码判断
subject().checkPermissions("system:user:create,delete,update:view");
用户拥有资源“system:user”的“create”、“update”、“delete”和“view”所有权限。如上可以简写成:
ini 配置文件(表示角色 5 拥有 system:user 的所有权限)
role52=system:user:*
也可以简写为(推荐上边的写法):
role53=system:user
然后通过如下代码判断
subject().checkPermissions("system:user:*");
subject().checkPermissions("system:user");
通过“system:user:*”验证“system:user:create,delete,update:view”可以,但是反过来是不成立的。
4、所有资源全部权限
ini 配置
role61=*:view
然后通过如下代码判断
subject().checkPermissions("user:view");
用户拥有所有资源的“view”所有权限。假设判断的权限是“"system:user:view”,那么需要“role5=::view”这样写才行
5、实例级别的权限
- 单个实例单个权限
ini 配置
role71=user:view:1
对资源 user 的 1 实例拥有 view 权限。
然后通过如下代码判断
subject().checkPermissions("user:view:1");
- 单个实例多个权限
ini 配置
role72="user:update,delete:1"
对资源 user 的 1 实例拥有 update、delete 权限。
然后通过如下代码判断
subject().checkPermissions("user:delete,update:1");
subject().checkPermissions("user:update:1", "user:delete:1");
- 单个实例所有权限
ini 配置
role73=user:*:1
对资源 user 的 1 实例拥有所有权限。
然后通过如下代码判断
subject().checkPermissions("user:update:1", "user:delete:1", "user:view:1");
- 所有实例单个权限
ini 配置
role74=user:auth:*
对资源 user 的 1 实例拥有所有权限。
然后通过如下代码判断
subject().checkPermissions("user:auth:1", "user:auth:2");
- 所有实例所有权限
ini 配置
role75=user:*:*
对资源 user 的 1 实例拥有所有权限。
然后通过如下代码判断
subject().checkPermissions("user:view:1", "user:auth:2");
6、Shiro 对权限字符串缺失部分的处理
如“user:view”等价于“user:view:*
”;而“organization”等价于“organization:*
”或者“organization:*:*
”。可以这么理解,这种方式实现了前缀匹配。
另外如“user:*
”可以匹配如“user:delete
”、“user:delete
”可以匹配如“user:delete:1
”、“user:*:1
”可以匹配如“user:view:1”、“user”可以匹配“user:view
”或“user:view:1
”等。即*
可以匹配所有,不加*
可以进行前缀匹配;但是如“*:view
”不能匹配“system:user:view
”,需要使用“*:*:view
”,即后缀匹配必须指定前缀(多个冒号就需要多个*
来匹配)。
评论