`
wuxiaozeng2440
  • 浏览: 25715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

apache shiro 简介

 
阅读更多
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能:
认证 - 用户身份识别,常被称为用户“登录”;
授权 - 访问控制,即权限或者角色;
密码加密 - 把JDK中复杂的密码加密方式进行封装;
会话管理 - 用户session管理器,可以让CS程序也使用session来控制权限。
除了以上功能,shiro还提供很多扩展
Web Support:主要针对web应用提供一些常用功能。
Caching:缓存可以使应用程序运行更有效率。
Concurrency:多线程相关功能。
Testing:帮助我们进行测试相关功能
Run As:一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
Remember Me:记住用户身份,提供类似购物车功能。
对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。

1.Subject:与程序进行交互的对象,简称用户
2.SecurityManager:shiro的核心,协调shiro的各个组件
3.Authenticator:登录控制
4.Authorizer :决定subject能拥有什么样角色或者权限。
5.SessionManager:创建和管理用户session。通过设置这个管理器,shiro可以在任何环境下使用session。
6.CacheManager :缓存管理器,可以减少不必要的后台访问。提高应用效率,增加用户体验。
7.Cryptography :Shiro的api大幅度简化java api中繁琐的密码加密。
8.Realms:程序与安全数据的桥梁,他获取安全数据来判断subject是否能够登录,subject拥有什么权限。


下面主要讲讲认证和授权是如何实现的:

认证:认证就是验证用户身份的过程。在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法。最常见的“实体/凭证”组合便是“用户名/密码”组合。

1.收集实体/凭据信息
UsernamePasswordToken token = new UsernamePasswordToken(username, password);  

2.提交实体/凭据信息,认证处理
Subject subject = SecurityUtils.getSubject();  
try {
subject.login(token);
} catch (UnknownAccountException ex) {//用户名没有找到。
} catch (IncorrectCredentialsException ex) {//用户名密码不匹配。
}catch (AuthenticationException e) {//其他的登录错误
}
//验证是否成功登录的方法
if (subject.isAuthenticated()) {
}


收集了实体/凭据信息之后,我们可以通过SecurityUtils工具类,获取当前的用户,然后通过调用login方法提交认证。 
如果login方法执行完毕且没有抛出任何异常信息,那么便认为用户认证通过。
3.认证回调
/**
* 认证回调函数, 登录时调用.
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws 

AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
User user = accountManager.getUserByLoginName(token.getUsername());
if (user != null) {
return new SimpleAuthenticationInfo(new ShiroUser(user.getId(), user.getLoginName(), 

user.getName()),
user.getPassword(), getName());
}
return null;

}

判断每一个Realm是否支持提交的token,如果支持,Realm将调用getAuthenticationInfo(token); getAuthenticationInfo 方法就是实际认证处理,我们通过覆盖Realm的doGetAuthenticationInfo方法来编写我们自定义的认证处理。
4.登出
currentUser.logout();

当执行完登出操作后,Session信息将被清空,subject将被视作为匿名用户。

授权:授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限。
如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,等等。
授权有着三个核心元素:权限、角色和用户。

权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限。
大多数的资源会支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的资源上才是有意义的。因此,权限声明的根本思想就是建立在资源以及操作上。
而我们通过权限声明仅仅能了解这个权限可以在应用程序中做些什么,而不能确定谁拥有此权限。 于是,我们就需要在应用程序中对用户和权限建立关联。
通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户。

Shiro支持三种方式实现授权过程:
编码实现
注解实现
JSP Taglig实现

编码实现
1.基于编码的角色授权实现
Subject currentUser = SecurityUtils.getSubject(); 
if (currentUser.hasRole("administrator")) {  
    //拥有角色administrator
} else {  
    //没有角色处理
}  

2.角色授权断言方式控制
Subject currentUser = SecurityUtils.getSubject(); 
//如果没有角色admin,则会抛出异常,someMethod()也不会被执行
currentUser.checkRole(“admin");  


3.基于编码的资源授权实现
Subject currentUser = SecurityUtils.getSubject();  
if (currentUser.isPermitted("permssion:look")) {  
    //有资源权限
} else {  
    //没有权限
}  

4.资源授权断言方式控制
Subject currentUser = SecurityUtils.getSubject();  
//如果没有资源权限则会抛出异常。
currentUser.checkPermission("permssion:look");  



基于注解的授权实现
@ RequiresAuthentication 
可以用户类/属性/方法,用于表明当前用户需是经过认证的用户。 
@RequiresPermissions("users:view")
当前用户需拥有查看权限
@RequiresRoles ("admin")
当前用户需拥有制定角色 

@RequestMapping(value = { "list", "" })
public String list(Model model) {
List<User> users = accountManager.getAll();
model.addAttribute("users", users);
return "account/userList";
}



在JSP上的TAG实现
<shiro:hasPermission name="users:edit">
<div><a class="btn" href="${ctx}/account/users/create">创建用户</a></div>
</shiro:hasPermission>
<shiro:hasAnyRoles name="abc,123" >
<shiro:hasRole name="abc">
<shiro:lacksRole name="abc">
<shiro:hasPermission name="abc">
<shiro:lacksPermission name="abc">



权限控制精度:
注解方式控制权限只能是在方法上控制,无法控制类级别访问。
过滤器方式控制是根据访问的URL进行控制。允许使用*匹配URL,所以可以进行粗粒度,也可以进行细粒度控制。


Spring security 与apache shiro 差别:
shiro配置更加容易理解,容易上手;security配置相对比较难懂。
在spring的环境下,security整合性更好。Shiro对很多其他的框架兼容性更好,号称是无缝集成。
shiro 不仅仅可以使用在web中,它可以工作在任何应用环境中。
在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的。
Shiro提供的密码加密使用起来非常方便。

分享到:
评论
2 楼 wuxiaozeng2440 2013-05-27  
shiro本来就是动态获取permission的
比如说有“项目经理”这样一个角色,本来它只有“查看用户”的权限,现在给它增加了”修改用户“的权限。那“项目经理”这个角色的所有人重新登录就具备了修改的权限了
1 楼 q474818917 2013-05-22  
我有个疑问:
动态的修改了用户的角色
怎么才能让shiro动态的获取新的permission
shiro:hasPermission

相关推荐

Global site tag (gtag.js) - Google Analytics