设为首页 收藏本站
查看: 1059|回复: 0

[经验分享] apache shiro 简介

[复制链接]

尚未签到

发表于 2016-12-30 09:44:37 | 显示全部楼层 |阅读模式
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提供的密码加密使用起来非常方便。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-321425-1-1.html 上篇帖子: org.apache.commons.beanutils.Converter 下篇帖子: apache主要项目
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表