【Shiro】01 概述 & 快速上手
什么是Shiro?
Apache Shiro 是Java的一个权限安全框架
一些功能:认证、授权、加密、会话管理、与Web 集成、缓存等
Shiro官网地址:[ 点击访问 ]
http://shiro.apache.org/
4个主要功能:
- Authentication
登陆,身份认证。完成用户登陆的密码匹配
- Authorization
授权,权限验证。判断一个请求和一些事件触发是否可以被允许
- Session Management
会话管理
- Cryptography
信息加密,对密码的安全加密处理
其他功能:
WebSupport,Web支持,集成JavaEE
Concurrency,高并发支持,多线程情况下的授权和认证
Testing,测试
Caching,缓存模块
RunAs,让已经登陆的用户以其他用户身份操作管理
RememberMe,记住我
Hello Shiro?
演示HelloShiro需要的一些核心组件
导入工程lib目录
导入Shiro配置文件和日志配置文件
没有Maven管理,配置文件就直接放在src目录下
对Shiro的快速入门源码解析:
1、创建Shiro安全管理器实例
// The easiest way to create a Shiro SecurityManager with configured // 创建Shiro安全管理器最简单的方式是使用配置 // realms, users, roles and permissions is to use the simple INI config. // 访问域,用户,角色(权限),行为,都放在这个简单的ini配置文件中 // We'll do that by using a factory that can ingest a .ini file and // 我们将会使用工厂实例注入ini配置文件, // return a SecurityManager instance: // 并且返回Shiro安全管理器的实例 // Use the shiro.ini file at the root of the classpath // shiro.ini配置文件放在类路径的根下面 // (file: and url: prefixes load from files and urls respectively): // 分别从文件和url加载前缀 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager = factory.getInstance();
2、继续配置安全管理器对象
// for this simple example quickstart, make the SecurityManager accessible as a JVM singleton. // 在这个简单的快速入门案例中,使安全管理器实例在JVM中是一个可访问的单利对象 // Most applications wouldn't do this // 但是在大多数应用中不会这么来干 // and instead rely on their container configuration or web.xml for webapps. // 并且对于webapps而言,是依赖于它们的容器配置文件或web.xml文件 // That is outside the scope of this simple quickstart, so // 这已经超出了我们shiro快速入门的范畴了,所以 // we'll just do the bare minimum so you can continue to get a feel for things. // 我们将只做一些你能继续体验的最基础的事情 SecurityUtils.setSecurityManager(securityManager); // Now that a simple Shiro environment is set up, let's see what you can do: // 现在Shiro的环境已经部署出来了,瞧瞧我们能干点啥
3、获取当前执行的用户
// get the currently executing user: // 获取当前正在执行的用户 Subject currentUser = SecurityUtils.getSubject();
获取当前的Subject对象
4、通过Session存储的认证信息来处理授权安全
获取 & 简单的判断
// Do some stuff with a Session (no need for a web or EJB container!!!) // 用会话做些事情(不需要web或EJB容器!!!)【测试Session】 // 获取Session Session session = currentUser.getSession(); // 在Session对象中注入某一属性 session.setAttribute("someKey", "aValue"); // 然后又获取这个属性值 String value = (String) session.getAttribute("someKey"); if (value.equals("aValue")) { //是否匹配 log.info("---> Retrieved the correct value! [" + value + "]"); }
5、权限详细的操作
// let's login the current user so we can check against roles and permissions: // 让我们登录当前用户,以便检查角色和权限: // 测试当前的用户是否已经认证,即是否登陆 调用isAuthenticated()方法判断 if (!currentUser.isAuthenticated()) { // 如果不是则把认证信息封装在一个令牌对象中 UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa"); // 对这个令牌对象设置 记住我 token.setRememberMe(true); try { // 执行登陆指令,能否成功取决于在shiro.ini中是否配置令牌中认证信息 currentUser.login(token); } // 未知账户异常 ,没有此用户抛出 catch (UnknownAccountException uae) { log.info("----> There is no user with username of " + token.getPrincipal()); return; } // 不正确的资格证书,账户的密码错误 catch (IncorrectCredentialsException ice) { log.info("----> Password for account " + token.getPrincipal() + " was incorrect!"); return; } //锁定的账户,该用户的账号已经上锁,请联系你的管理员解锁 catch (LockedAccountException lae) { log.info("The account for username " + token.getPrincipal() + " is locked. " + "Please contact your administrator to unlock it."); } // ... catch more exceptions here (maybe custom ones specific to your application? // 更多的授权异常问题,翻阅shiro文档详细 catch (AuthenticationException ae) { //unexpected condition? error? } } //say who they are: // 说明 这是谁的用户 // print their identifying principal (in this case, a username): // 打印它们的标识主体,在这个演示案例中,只有一个用户名称 log.info("----> User [" + currentUser.getPrincipal() + "] logged in successfully."); //test a role: // 测试权限 // hasRole,判断是否存在这样一个角色权限? if (currentUser.hasRole("schwartz")) { // 存在,愿施瓦兹与你同在 log.info("----> May the Schwartz be with you!"); } else { // 你好,凡人 log.info("----> Hello, mere mortal."); return; } //test a typed permission (not instance-level) // 测试一用户是否具备这个行为 isPermitted() if (currentUser.isPermitted("lightsaber:weild")) { // 你有这个行为,请明智的使用 log.info("----> You may use a lightsaber ring. Use it wisely."); } else { // 对卟住,这只是大师才能用的行为 log.info("Sorry, lightsaber rings are for schwartz masters only."); } //a (very powerful) Instance Level permission: // 一个非常强大的实例等级行为 // 判断这个用户是否被允许了 if (currentUser.isPermitted("user:delete:zhangsan")) { log.info("----> You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'. " + "Here are the keys - have fun!"); } else { log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!"); }
6、完成安全授权,退出
// 判断是否完成了授权验证 System.out.println("---->" + currentUser.isAuthenticated()); //all done - log out! // 全部搞定,退出 currentUser.logout(); System.out.println("---->" + currentUser.isAuthenticated()); System.exit(0);