发表于: 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");&nbsp;

通过“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");&nbsp;
  • 单个实例所有权限

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”,即后缀匹配必须指定前缀(多个冒号就需要多个*来匹配)。



返回列表 返回列表
评论

    分享到