Apache shiro集群实现 (一) shiro入门介绍

Apache shiro集群实现 (二) shiro 的INI配置

Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)

Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制

Apache shiro集群实现 (五)分布式集群系统下的高可用session解决方案

Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

授权(Authorization)也叫做访问控制,是一个对资源的访问进行管理的过程,也就是说在应用程序汇总,谁有怎样的权限(用户可以看到什么内容,可以进行什么操作)。

       在ITOO项目中,首先是考虑基于角色的授权,当用户的角色发生变化的时候,不灵活,所以为了更好的结合项目的实际情况,是采用的通过字符串的方式的权限验证;当然针对后台的方法的可以采用注解式的权限控制(可以用户类/属性/方法,用于表明当前用户需是经过认证的用户)。

授权的三要素

权限

      权限是shiro权限系统中的原子单位,明确定义了用户的行为,例如用户在系统中可以做什么不可以做什么。



例如:下载某个文件,访问/user/list链接,删除用户等等。权限一般都是基于资源和对资源的操作(例如CRUD等)的。



权限只是反映了行为(对资源的操作),不反应谁去执行。权限要分配给用户,或者角色,来确定哪些用户拥有某些权限。



资源



      系统中的所有可访问,可操作的所有的东西。例如,系统中的链接,按钮,方法,等等。

用户

       也叫主体(Subjects),访问应用的人或者其他的,例如另一个应用程序。用户只有被授权了才可以访问系统的资源。

权限

权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限。

大多数的资源会支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的资源上才是有意义的。因此,权限声明的根本思想就是建立在资源以及操作上。

而我们通过权限声明仅仅能了解这个权限可以在应用程序中做些什么,而不能确定谁拥有此权限。 于是,我们就需要在应用程序中对用户和权限建立关联。 通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户。

角色

1、传统角色:

一个角色代表着一系列的操作,当需要对某一操作进行授权验证时,只需判断是否是该角色即可。这种角色权限相对简单、模糊,不利于扩展。

2、权限角色:

一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有该权限。这种角色权限可以对该角色进行详细的权限描述,适合更复杂的权限设计。

下面将详细描述对两种角色模式的授权实现。

下面将详细描述对两种角色模式的授权实现。

Shiro支持三种方式实现授权过程:

• 编码实现

• 注解实现

• JSP Taglig实现

1、在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等)

2、Subject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。

3、接下来SecurityManager会委托内置的Authorizer的实例(默认是ModularRealmAuthorizer 类的实例,类似认证实例,它同样支持一个或多个Realm实例认证)调用相应的授权方法。

4、每一个Realm将检查是否实现了相同的 Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。

在认证、授权内部实现机制中都有提到,最终处理都将交给Real进行处理。因为在Shiro中,最终是通过Realm来获取应用程序中的用户、角色及权限信息的。通常情况下,在Realm中会直接从我们的数据源中获取Shiro需要的验证信息。可以说,Realm是专用于安全框架的DAO.

正如前文所提到的,Shiro的认证过程最终会交由Realm执行,这时会调用Realm的getAuthenticationInfo(token)方法。

该方法主要执行以下操作:

1、检查提交的进行认证的令牌信息

2、根据令牌信息从数据源(通常为数据库)中获取用户信息

3、对用户信息进行匹配验证。

4、验证通过将返回一个封装了用户信息的AuthenticationInfo实例。

5、验证失败则抛出AuthenticationException异常信息。

而在我们的应用程序中要做的就是自定义一个Realm类,继承AuthorizingRealm抽象类,重载doGetAuthenticationInfo (),重写获取用户信息的方法。

Java代码

而授权实现则与认证实现非常相似,在我们自定义的Realm中,重载doGetAuthorizationInfo()方法,重写获取用户权限的方法即可。

Java代码

授权实现

Reaml实现

一、认证实现

<span style="font-size:18px;"><span style="font-size:18px;">1.protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
2. UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
3. User user = accountManager.findUserByUserName(token.getUsername());
4. if (user != null) {
5. return new SimpleAuthenticationInfo(user.getUserName(), user.getPassword(), getName());
6. } else {
7. return null;
8. }
9. } </span></span>

二、授权实现

根据角色解析相应的权限集合。

<span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.itoo.authority.service;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Resource;
import org.apache.shiro.SecurityUtils;
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.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.cas.CasRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import com.tgb.itoo.authority.entity.AllUsers;
public class ShiroRealmBean extends CasRealm {
// 用于获取用户信息及用户权限信息的业务接口
private ShiroBean permissionMgr;
// 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
// 权限名称
String permissionName;
try {
// 查询用户授权信息
SimpleAuthorizationInfo author = new SimpleAuthorizationInfo();
// 查找登录用户名称
String username = (String) principals.getPrimaryPrincipal();
System.out.println(username);
// 查询用户对应角色对应的资源
List<String> lstPermission = permissionMgr
.queryUserPermission(username);
// 迭代查询
Iterator<String> it = lstPermission.iterator();
while (it.hasNext()) {
permissionName = it.next().toString();
// 把资源名称添加到用户所对于的资源集合中
author.addStringPermission(permissionName);
}
return author;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public ShiroBean getPermissionMgr() {
return permissionMgr;
}
public void setPermissionMgr(ShiroBean permissionMgr) {
this.permissionMgr = permissionMgr;
}
}</span></span>

在jsp页面我们引入shiro标签

<span style="font-size:18px;"><span style="font-size:18px;"><%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%></span></span>

在想控制的元素加这样的标签,根据字符串来判断即可

<span style="font-size:18px;"><span style="font-size:18px;"><shiro:hasPermission name="itoo-authority-role-role-add">
<a href="javascript:void(0)" id="btnAdd" class="easyui-linkbutton"
style="height: 30px; width: 60px" iconCls="icon-add" plain="true"
onclick="addRoleUI()">添加</a>     
</shiro:hasPermission> <shiro:hasPermission name="itoo-authority-role-role-edit">
<a href="javascript:void(0)" id="btnEdit" class="easyui-linkbutton"
style="height: 30px; width: 60px" iconCls="icon-edit" plain="true"
onclick="editRoleUI()">编辑</a>    
</shiro:hasPermission>
<shiro:hasPermission name="itoo-authority-role-role-delete">
<a href="javascript:void(0)" id="btnDel" class="easyui-linkbutton"
style="height: 30px; width: 60px" iconCls="icon-remove"
plain="true" onclick="deleteRole()">删除</a>    
</shiro:hasPermission></span></span>

基于角色解析的相应的权限集合实现了按钮和资源的控制,接下来一起学习解决session,共享、资源cache共享 ,结合redis来实现,首先我们应该学习高可用性集群下的相关内容

分布式集群系统下的高可用session解决方案

Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制的更多相关文章

  1. Apache shiro集群实现 (八) web集群时session同步的3种方法

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  2. Apache shiro集群实现 (七)分布式集群系统下---cache共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  3. Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  4. Apache shiro集群实现 (五)分布式集群系统下的高可用session解决方案

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  5. Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  6. Apache shiro集群实现 (二) shiro 的INI配置

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  7. Apache shiro集群实现 (一) shiro入门介绍

    近期在ITOO项目中研究使用Apache shiro集群中要解决的两个问题,一个是Session的共享问题,一个是授权信息的cache共享问题,官网上给的例子是Ehcache的实现,在配置说明上不算很 ...

  8. 集群环境下Shiro Session的管理

    问题引入 紧接上篇连接 在多台tomcat集群中,shiro管理的session需要放在Redis中,我们只需要增加redisSessionDAO的配置就行 <!-- 定义会话管理器的操作 表示 ...

  9. Linux+Apache+Tomcat集群配置

    参考: http://blog.csdn.net/bluishglc/article/details/6867358# http://andashu.blog.51cto.com/8673810/13 ...

随机推荐

  1. 使用redis,zookeeper实现分布式锁

    1.分布式锁 分布式锁一般用在分布式系统或者多个应用中,用来控制同一任务是否执行或者任务的执行顺序.在项目中,部署了多个tomcat应用,在执行定时任务时就会遇到同一任务可能执行多次的情况,我们可以借 ...

  2. Struts2--拦截器Interceptor

    拦截器是的我们可以在方法的执行前后定义执行的操作.可以作为一个非常有力的工具在数据验证,属性设置,安全,日志等等方面. 拦截器可以链接起来形成一个拦截器栈.框架会按照拦截器定义的顺序依次调用这些拦截器 ...

  3. [HNOI2010]弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  4. APIO dispatching

    题目描述 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增 ...

  5. bzoj 2118: 墨墨的等式

    Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...

  6. 【HNOI2017】大佬

    题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...

  7. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  8. ●BZOJ 4698 Sdoi2008 Sandy的卡片

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4698 题解: 后缀数组,二分这个题还是比较套路的.首先依据题意,把各个串差分以后,用分割符号 ...

  9. [SPOJ705]不同的子串

    题目描述] 给定一个字符串,计算其不同的子串个数. [输入格式] 一行一个仅包含大写字母的字符串,长度<=50000 [输出格式] 一行一个正整数,即不同的子串个数. [样例输入] ABABA ...

  10. ●BZOJ 4559 [JLoi2016]成绩比较

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 计数dp,拉格朗日插值法.真的是神题啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 ...