什么是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。

  1. public class CustomRealm extends AuthorizingRealm {
  2. @Override
  3. public String getName() {
  4. return "customRealm";
  5. }
  6. // 用于认证
  7. @Override
  8. protected AuthenticationInfo doGetAuthenticationInfo(
  9. AuthenticationToken token) throws AuthenticationException {
  10. // token是用户输入的
  11. // 第一步从token中取出身份信息
  12. String userCode = (String) token.getPrincipal();
  13. // 第二步:根据用户输入的userCode从数据库中查询
  14. // 模拟从数据库查询到密码
  15. String password = "111111";
  16. // 如果查询到返回认证信息AuthenticationInfo
  17. SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
  18. userCode, password, this.getName());
  19. return simpleAuthenticationInfo;
  20. }
  21. }

3.配置shiro-realm.ini文件

  1. [main]
  2. #自定义realm
  3. customRealm=cn.itcast.shiro.realm.CustomRealm
  4. #将realm设置到securityManager,相当于spring中注入
  5. securityManager.realms=$customRealm

4.创建认证代码

  1. // 用户登录和退出
  2. @Test
  3. public void testCustomRealm() {
  4. // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
  5. Factory<SecurityManager> factory = new IniSecurityManagerFactory(
  6. "classpath:shiro-realm.ini");
  7. // 通过工厂创建SecurityManager
  8. SecurityManager securityManager = factory.getInstance();
  9. // 将securityManager设置到运行环境中
  10. SecurityUtils.setSecurityManager(securityManager);
  11. // 创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
  12. Subject subject = SecurityUtils.getSubject();
  13. // 创建token令牌,记录用户认证的身份和凭证即账号和密码
  14. UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
  15. "111111");
  16. try {
  17. // 用户登陆
  18. subject.login(token);
  19. } catch (AuthenticationException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. // 用户认证状态
  24. Boolean isAuthenticated = subject.isAuthenticated();
  25. System.out.println("用户认证状态:" + isAuthenticated);
  26. // 用户退出
  27. subject.logout();
  28. isAuthenticated = subject.isAuthenticated();
  29. System.out.println("用户认证状态:" + isAuthenticated);
  30. }

5.认证流程

(1)创建token令牌,token中有用户提交的认证信息即账号和密码

(2)执行subject.login(token),最终由securityManager通过Authenticator进行认证

(3)Authenticator的实现ModularRealmAuthenticator调用realm从数据库中取用户真实的账号和密码

(4)CustomRealm先根据token中的账号去数据库中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

6.测试

登录时用户认证成功,退出时用户认证失败。

shiro授权

授权流程

授权方式

shiro支持三种方式的授权:

1.编程式

  1. Subject subject = SecurityUtils.getSubject();
  2. if(subject.hasPermission(“admin”)) {
  3. //有权限
  4. } else {
  5. //无权限
  6. }

2.注解式

  1. @RequiresPermissions("admin")
  2. public void hello() {
  3. //有权限
  4. }

3.JSP/GSP标签

  1. <shiro:hasPermission name="admin">
  2. <!— 有权限—>
  3. </shiro:hasRole>

在web系统集成中使用后两种方式,我在这儿举个简单的例子就用第一种方式了。

实例

1.自定义realm

  1. // 用于授权
  2. @Override
  3. protected AuthorizationInfo doGetAuthorizationInfo(
  4. PrincipalCollection principals) {
  5. // 获取身份信息
  6. //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到Simpl)
  7. String username = (String) principals.getPrimaryPrincipal();
  8. // 根据身份信息从数据库中查询权限数据
  9. // ....这里使用静态数据模拟
  10. List<String> permissions = new ArrayList<String>();
  11. permissions.add("user:create");
  12. permissions.add("user:delete");
  13. // 将权限信息封闭为AuthorizationInfo
  14. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
  15. for (String permission : permissions) {
  16. simpleAuthorizationInfo.addStringPermission(permission);
  17. }
  18. return simpleAuthorizationInfo;
  19. }

2.配置shiro-realm.ini文件与上面认证配置文件相同

3.创建授权代码

  1. // 自定义realm进行资源授权测试
  2. @Test
  3. public void testAuthorizationCustomRealm() {
  4. // 从ini文件中创建SecurityManager工厂
  5. Factory<SecurityManager> factory = new IniSecurityManagerFactory(
  6. "classpath:shiro-realm.ini");
  7. // 创建SecurityManager
  8. SecurityManager securityManager = factory.getInstance();
  9. // 将securityManager设置到运行环境
  10. SecurityUtils.setSecurityManager(securityManager);
  11. // 创建主体对象
  12. Subject subject = SecurityUtils.getSubject();
  13. // 对主体对象进行认证
  14. // 用户登陆
  15. // 设置用户认证的身份(principals)和凭证(credentials)
  16. UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
  17. "111111");
  18. try {
  19. subject.login(token);
  20. } catch (AuthenticationException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. }
  24. // 用户认证状态
  25. Boolean isAuthenticated = subject.isAuthenticated();
  26. System.out.println("用户认证状态:" + isAuthenticated);
  27. // 授权检测,失败则抛出异常
  28. // subject.checkRole("role22");
  29. // 基于资源授权
  30. System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
  31. System.out.println("是否拥有多个权限:"
  32. + subject.isPermittedAll("user:update", "user:delete"));
  33. // 检查权限
  34. subject.checkPermission("user:delete");
  35. }

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权限认证与授权的更多相关文章

  1. Shiro入门之一 -------- Shiro权限认证与授权

    一  将Shirojar包导入web项目 二 在web.xml中配置shiro代理过滤器 注意: 该过滤器需要配置在struts2过滤器之前 <!-- 配置Shiro的代理过滤器 -->  ...

  2. 使用Shiro实现认证和授权(基于SpringBoot)

    Apache Shiro是一个功能强大且易于使用的Java安全框架,它为开发人员提供了一种直观,全面的身份验证,授权,加密和会话管理解决方案.下面是在SpringBoot中使用Shiro进行认证和授权 ...

  3. 学习Spring Boot:(十三)配置 Shiro 权限认证

    经过前面学习 Apache Shiro ,现在结合 Spring Boot 使用在项目里,进行相关配置. 正文 添加依赖 在 pom.xml 文件中添加 shiro-spring 的依赖: <d ...

  4. 权限认证与授权(Shrio 框架)

    权限概述 认证: 系统提供的用于识别用户身份的功能, 通常登录功能就是认证功能; -- 让系统知道你是谁 授权: 系统授予用户可以访问哪些功能的证书. -- 让系统知道你能做什么! 常见的权限控制方式 ...

  5. ssm整合shiro—实现认证和授权

    1.简述 1.1    Apache Shiro是Java的一个安全框架.是一个相对简单的框架,主要功能有认证.授权.加密.会话管理.与Web集成.缓存等. 1.2   Shiro不会去维护用户.维护 ...

  6. Spring Boot 整合 Shiro实现认证及授权管理

    Spring Boot Shiro 本示例要内容 基于RBAC,授权.认证 加密.解密 统一异常处理 redis session支持 介绍 Apache Shiro 是一个功能强大且易于使用的Java ...

  7. 在web项目中使用shiro(认证、授权)

    一.在web项目中实现认证 第一步,在web项目中导入shiro依赖的包 第二步,在web.xml中声明shiro拦截权限的过滤器 <filter> <filter-name> ...

  8. Shiro的认证与授权

    shiro实战教程 一.权限管理 1.1什么是权限管理 基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以 ...

  9. shiro权限认证Realm的四大用法

    一.SimpleAccountRealm public class AuthenticationTest {          SimpleAccountRealm sar=new SimpleAcc ...

随机推荐

  1. Final阶段版本控制报告

    版本控制代码及文档要求 在coding.net版本控制; 公开项目,教师.专家.其他同学可以不注册源代码.在此公布git地址. 报告beta阶段2周中,项目的版本控制情况,不包括未在coding.ne ...

  2. Daily Scrumming 2015.10.21(Day 2)

    今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 配置ruby与rails环境 配置mysql与数据库用户管理 配置apache2环境 学习rails Ac ...

  3. apm server

    目录 1.apm的tomcat启动失败解决方法 2.apm的mysql修改root密码的方法 内容: 1.apm的tomcat启动失败解决方法 APMServ5.2.6 无法启动Apache的一个问题 ...

  4. 初涉JSP+JDBC 基于SQL2008的登陆验证程序

    简单的以代码的形式纪念一下,因为现在还没有解决SQL2008驱动的问题,并且有好多东西要学,所以日后会有更新~ 所安装的软件有:SQL2008,eclipse,tomcat,JDK,涉及环境配置.等等 ...

  5. 在新的电脑上部署 Hexo,保留原有博客的方法

    用U盘从旧的电脑拷贝整个blog文件夹. 在新的电脑上装好git并配置好用户名和密钥. 安装 node.js 安装 hexo:npm install hexo-cli -g 用U盘把blog文件夹拷贝 ...

  6. 《TCP/IP 详解 卷1:协议》第 8 章:Internet 控制报文协议

    路由器是 Internet 的重要组成部分,严密监视 Internet 的操作.IP 协议未给发送失败的 IP 数据包提供一种错误处理,也没有给端系统提供直接的方法来发现错误.为了解决这一不足之处,I ...

  7. Good Time 冲刺 六

    一.今日完成任务情况 第六天 日期:2018.6.19 王怡镔:今天完善了页面,对部分不足进行改进. 于鑫宇:对界面进行完善. 胡雅馨:今天完成前端页面,并改善后端,完善项目. 黄 鹤:做完最后的打卡 ...

  8. Internet History, Technology and Security (Week 6)

    Week 6 Technology: Transport Control Protocol (TCP) Welcome to Week 6 of IHTS. We are in our second ...

  9. Few-Shot/One-Shot Learning

    Few-Shot/One-Shot Learning指的是小样本学习,目的是克服机器学习中训练模型需要海量数据的问题,期望通过少量数据即可获得足够的知识. Matching Networks for ...

  10. 基于 Jmeter 的 web 端接口自动化测试平台

    简介 基于之前的react+unittest+flask的接口自动化平台开发经验,和趟过的坑,我重新开发了这个接口自动化平台.平台前端采用的antd+dva+umi的antd-pro模板,结合平台业务 ...