博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shiro
阅读量:6951 次
发布时间:2019-06-27

本文共 2014 字,大约阅读时间需要 6 分钟。

Shiro是Apache的一个开源框架,提供了认证、授权、加密、会话管理、与Web集成、缓存等功能。Shiro属于轻量框架,不仅可以实现web应用的权限管理,还可以实现c/s系统,分布式系统权限管理。

基本功能

Authentication
身份认证,登录时使用,验证用户是否存在。
Authorization
授权,验证用户是否拥有某个权限。
Session Manager
会话管理。用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中。
Cryptography
加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储。
Web Support
Web支持,可以非常容易的集成到Web环境。
Caching
缓存。用户登录后,其用户信息、拥有的角色、权限不必每次去查数据库,这样可以提高效率。
Concurrency
Shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。
Testing
提供测试支持。
Run As
允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。
Remember Me
记住我。一次登录后,下次不用登录。

核心组件

Subject
代表当前用户,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等。
SecurityManager
安全管理器,是Shiro的核心。管理着所有Subject,所有与安全有关的操作都会与SecurityManager交互。如果学习过SpringMVC,可以把它看成DispatcherServlet。
Realm
相当于数据源,通过Realm认证、授权相关数据。一般情况下在项目中需要自定义Realm,重写认证和授权的方法。

Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。

认证原理

1.创建SecurityManager。
2.调用Subject.login方法提交认证。
3.SecurityManager调用IniRealm进行认证。
4.接收IniRealm返回Authentication认证信息。

授权原理

1.对Subject进行授权,调用方法isPermitted("permission串")。
2.SecurityManager执行授权,通过ModularRealmAuthorizer执行授权。
3.ModularRealmAuthorizer调用自定义的Realm.doGetAuthorizationInfo从数据库中查询权限。
4.ModularRealmAuthorizer调用PermissionResolver进行权限串比对。
5.对比时,通过isPermitted中"permission串"进行校验,如果没有权限,抛出异常。

Shiro的授权方式

1.通过写if/else代码块完成。(这种比较少用,一般在项目中采用后两种)
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
2.注解。
@RequiresPermissions("system:operator:list")
public Object list() {
//有权限
}
3.JSP/GSP标签。
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %>
<shiro:authenticated> - 登录之后
<shiro:notAuthenticated> - 不在登录状态时
<shiro:guest> - 用户在没有RememberMe时
<shiro:user> - 用户在RememberMe时
<shiro:hasAnyRoles name="abc,123" > - 在有abc或者123角色时
<shiro:hasRole name="abc"> - 拥有角色abc
<shiro:lacksRole name="abc"> - 没有角色abc
<shiro:hasPermission name="abc"> - 拥有权限资源abc
<shiro:lacksPermission name="abc"> - 没有abc权限资源
<shiro:principal> - 显示用户身份名称
<shiro:principal property="username"/> - 显示用户身份中的属性值
<shiro:hasRole name="admin"><!— 有admin角色权限 —></shiro:hasRole>

转载于:https://www.cnblogs.com/lc19149/p/9340912.html

你可能感兴趣的文章
2015年9月份全球主流浏览器市场份额排行榜
查看>>
Immutable & Redux in Angular Way
查看>>
为什么 Linux 内核开发仍然使用电子邮件
查看>>
《自顶向下网络设计(第3版)》——1.6 复习题
查看>>
【转】微信小程序给程序员带来的可能是一个赚钱的机遇
查看>>
《Programming Ruby中文版:第2版》终于正式出版了
查看>>
【RSA专题】在RSA2017大会上你会看到什么?勒索软件、物联网、区块链(以及更多)!...
查看>>
《精通Android 5 多媒体开发》——第6章,第6.3节实现Overlay硬件抽象层
查看>>
震撼可视化,讲述宇宙生命和宇宙垃圾
查看>>
如何在 Ubuntu16.04 中用 Apache 部署 Jenkins 自动化服务器
查看>>
《jQuery Cookbook中文版》——1.17 在不造成全局冲突的情况下使用$别名
查看>>
大数据常见术语表
查看>>
奥克斯天猫618首日破亿,有态度的国货空调说这是新常态
查看>>
《微软云计算Windows Azure开发与部署权威指南》——6.10 小结
查看>>
在UEFI模式下安装Ubuntu 14.04与Windows 8/8.1双启动
查看>>
《破茧成蝶——用户体验设计师的成长之路》—2.2 用户体验设计师的价值
查看>>
《CCNA学习指南:数据中心(640-911)》——2.4 小结
查看>>
《Android游戏开发详解》——第3章,第3.6节图形
查看>>
《Spring 5 官方文档》16.ORM和数据访问(三)
查看>>
格灵深瞳出手,灵异视频告破
查看>>