shiro权限认证与授权
什么是shiro?
Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
为什么要用shiro?
既然可以基于url实现权限的管理,为什么还要用shiro呢??
1.shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。最主要的就是方便了我们的开发。
2.shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。
shiro认证
认证流程:
实例:
1.创建一个Java工程,并加入shiro-core的jar包以及它的依赖包。
2.自定义realm
Shiro有自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm。
- public class CustomRealm extends AuthorizingRealm {
- @Override
- public String getName() {
- return "customRealm";
- }
- // 用于认证
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(
- AuthenticationToken token) throws AuthenticationException {
- // token是用户输入的
- // 第一步从token中取出身份信息
- String userCode = (String) token.getPrincipal();
- // 第二步:根据用户输入的userCode从数据库中查询
- // 模拟从数据库查询到密码
- String password = "111111";
- // 如果查询到返回认证信息AuthenticationInfo
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
- userCode, password, this.getName());
- return simpleAuthenticationInfo;
- }
- }
3.配置shiro-realm.ini文件
- [main]
- #自定义realm
- customRealm=cn.itcast.shiro.realm.CustomRealm
- #将realm设置到securityManager,相当于spring中注入
- securityManager.realms=$customRealm
4.创建认证代码
- // 用户登录和退出
- @Test
- public void testCustomRealm() {
- // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
- Factory<SecurityManager> factory = new IniSecurityManagerFactory(
- "classpath:shiro-realm.ini");
- // 通过工厂创建SecurityManager
- SecurityManager securityManager = factory.getInstance();
- // 将securityManager设置到运行环境中
- SecurityUtils.setSecurityManager(securityManager);
- // 创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
- Subject subject = SecurityUtils.getSubject();
- // 创建token令牌,记录用户认证的身份和凭证即账号和密码
- UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
- "111111");
- try {
- // 用户登陆
- subject.login(token);
- } catch (AuthenticationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 用户认证状态
- Boolean isAuthenticated = subject.isAuthenticated();
- System.out.println("用户认证状态:" + isAuthenticated);
- // 用户退出
- subject.logout();
- isAuthenticated = subject.isAuthenticated();
- System.out.println("用户认证状态:" + isAuthenticated);
- }
5.认证流程
(1)创建token令牌,token中有用户提交的认证信息即账号和密码
(2)执行subject.login(token),最终由securityManager通过Authenticator进行认证
(3)Authenticator的实现ModularRealmAuthenticator调用realm从数据库中取用户真实的账号和密码
(4)CustomRealm先根据token中的账号去数据库中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。
6.测试
登录时用户认证成功,退出时用户认证失败。
shiro授权
授权流程
授权方式
shiro支持三种方式的授权:
1.编程式
- Subject subject = SecurityUtils.getSubject();
- if(subject.hasPermission(“admin”)) {
- //有权限
- } else {
- //无权限
- }
2.注解式
- @RequiresPermissions("admin")
- public void hello() {
- //有权限
- }
3.JSP/GSP标签
- <shiro:hasPermission name="admin">
- <!— 有权限—>
- </shiro:hasRole>
在web系统集成中使用后两种方式,我在这儿举个简单的例子就用第一种方式了。
实例
1.自定义realm
- // 用于授权
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(
- PrincipalCollection principals) {
- // 获取身份信息
- //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到Simpl)
- String username = (String) principals.getPrimaryPrincipal();
- // 根据身份信息从数据库中查询权限数据
- // ....这里使用静态数据模拟
- List<String> permissions = new ArrayList<String>();
- permissions.add("user:create");
- permissions.add("user:delete");
- // 将权限信息封闭为AuthorizationInfo
- SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
- for (String permission : permissions) {
- simpleAuthorizationInfo.addStringPermission(permission);
- }
- return simpleAuthorizationInfo;
- }
2.配置shiro-realm.ini文件与上面认证配置文件相同
3.创建授权代码
- // 自定义realm进行资源授权测试
- @Test
- public void testAuthorizationCustomRealm() {
- // 从ini文件中创建SecurityManager工厂
- Factory<SecurityManager> factory = new IniSecurityManagerFactory(
- "classpath:shiro-realm.ini");
- // 创建SecurityManager
- SecurityManager securityManager = factory.getInstance();
- // 将securityManager设置到运行环境
- SecurityUtils.setSecurityManager(securityManager);
- // 创建主体对象
- Subject subject = SecurityUtils.getSubject();
- // 对主体对象进行认证
- // 用户登陆
- // 设置用户认证的身份(principals)和凭证(credentials)
- UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
- "111111");
- try {
- subject.login(token);
- } catch (AuthenticationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 用户认证状态
- Boolean isAuthenticated = subject.isAuthenticated();
- System.out.println("用户认证状态:" + isAuthenticated);
- // 授权检测,失败则抛出异常
- // subject.checkRole("role22");
- // 基于资源授权
- System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
- System.out.println("是否拥有多个权限:"
- + subject.isPermittedAll("user:update", "user:delete"));
- // 检查权限
- subject.checkPermission("user:delete");
- }
4.授权流程
(1)执行subject.isPermitted("user:delete")
(2)securityManager通过ModularRealmAuthorizer进行授权
(3)ModularRealmAuthorizer调用realm获取权限信息
(4)ModularRealmAuthorizer再通过permissionResolver解析权限字符串,校验是否匹配
5.测试
表明该用户拥有delete权限但是不拥有update权限。
转载:http://blog.csdn.net/u010539352/article/details/51220276
shiro权限认证与授权的更多相关文章
- Shiro入门之一 -------- Shiro权限认证与授权
一 将Shirojar包导入web项目 二 在web.xml中配置shiro代理过滤器 注意: 该过滤器需要配置在struts2过滤器之前 <!-- 配置Shiro的代理过滤器 --> ...
- 使用Shiro实现认证和授权(基于SpringBoot)
Apache Shiro是一个功能强大且易于使用的Java安全框架,它为开发人员提供了一种直观,全面的身份验证,授权,加密和会话管理解决方案.下面是在SpringBoot中使用Shiro进行认证和授权 ...
- 学习Spring Boot:(十三)配置 Shiro 权限认证
经过前面学习 Apache Shiro ,现在结合 Spring Boot 使用在项目里,进行相关配置. 正文 添加依赖 在 pom.xml 文件中添加 shiro-spring 的依赖: <d ...
- 权限认证与授权(Shrio 框架)
权限概述 认证: 系统提供的用于识别用户身份的功能, 通常登录功能就是认证功能; -- 让系统知道你是谁 授权: 系统授予用户可以访问哪些功能的证书. -- 让系统知道你能做什么! 常见的权限控制方式 ...
- ssm整合shiro—实现认证和授权
1.简述 1.1 Apache Shiro是Java的一个安全框架.是一个相对简单的框架,主要功能有认证.授权.加密.会话管理.与Web集成.缓存等. 1.2 Shiro不会去维护用户.维护 ...
- Spring Boot 整合 Shiro实现认证及授权管理
Spring Boot Shiro 本示例要内容 基于RBAC,授权.认证 加密.解密 统一异常处理 redis session支持 介绍 Apache Shiro 是一个功能强大且易于使用的Java ...
- 在web项目中使用shiro(认证、授权)
一.在web项目中实现认证 第一步,在web项目中导入shiro依赖的包 第二步,在web.xml中声明shiro拦截权限的过滤器 <filter> <filter-name> ...
- Shiro的认证与授权
shiro实战教程 一.权限管理 1.1什么是权限管理 基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以 ...
- shiro权限认证Realm的四大用法
一.SimpleAccountRealm public class AuthenticationTest { SimpleAccountRealm sar=new SimpleAcc ...
随机推荐
- 关于MySql8.X设置允许root远程登陆的问题
这是最近在mac上使用mysql workbench上遇到的一个小问题,仔细想了想其实这个问题本身就有毛病,论起正式环境来哪家公司是直接使用root去远程登录的呢?恐怕没几个,so不纠结root了创建 ...
- Linux 做网关
首先创建两张路由表,只需要添加到相应的文件中即可,Linux一共支持255个路由表,rt_tables文件中默认已经存在了三张路由表,分别是: 255 local 254 main 2 ...
- 小米6x抓包小程序https请求
1. charles安装证书,手机设置代理等这里不多讲了, 请进入下面链接查看详细 https://blog.csdn.net/manypeng/article/details/79475870 2. ...
- “Hello World!”Final发布文案加美工
文案: 大家好,我们是“Hello World!”团队,本次我将向大家简要介绍一下空天猎的final发布,在空天猎final发布中,我主要从以下两个方面向大家进行介绍,第一个方面是增加了敌方的boss ...
- “Gogoing”改进方案
通过看见他们对我们团队的意见点评,我们还要有更多改善的地方. 首先,就是界面的优化: 其次,加上自己些特有的功能,吸引更多的用户: 然后,需要整理大量的数据库信息才能完善: 最后,需要有其他软件的集成 ...
- Android笔记-4-实现登陆页面并跳转和简单的注册页面
实现登陆页面并跳转和简单的注册页面 首先我们来看看布局的xml代码 login.xml <span style="font-family:Arial;font-size:18px; ...
- 灵悟礼品网上专卖店——第三阶段Sprint
一.小组成员: 洪雪意(产品负责人) 陈淑筠(Master) 二.组内人员任务情况 已完成的任务: 陈淑筠:主页面的设计 洪雪意:导航条的改进和页面中插入页面的功能 正在进行的任务: 陈淑筠:主页面的 ...
- 作业6 团队项目之(开始第一个Sprint)
一.模仿并超越--类似应用. 五个app:1.四则运算小学堂(500-999次下载 3.57M) 2.小学生算术练习(9000+次下载 232K) 3.小学生加减题生成练习工具(2万-3万次下载 1. ...
- java中的装箱与拆箱
什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = ...
- ASP.NET MVC 5.0 参考源码索引
http://www.projky.com/asp.netmvc/5.0/Microsoft/AspNet/Mvc/Facebook/FacebookAppSettingKeys.cs.htmlhtt ...