shiro入门学习课件
- 格式:pdf
- 大小:3.36 MB
- 文档页数:27
一、介绍:shiro是apache提供的强大而灵活的开源安全框架,它主要用来处理身份认证,授权,企业会话管理和加密。
shiro功能:用户验证、用户执行访问权限控制、在任何环境下使用session API,如cs程序。
可以使用多数据源如同时使用oracle、mysql。
单点登录(sso)支持。
remember me服务。
详细介绍还请看官网的使用手册:/reference.html与spring security区别,个人觉得二者的主要区别是:1、shiro灵活性强,易学易扩展。
同时,不仅可以在web中使用,可以工作在任务环境内中。
2、acegi灵活性较差,比较难懂,同时与spring整合性好。
如果对权限要求比较高的项目,个人建议使用shiro,主要原因是可以很容易按业务需求进行扩展。
附件是对与shiro集成的jar整合及源码。
二、shiro与spring集成shiro默认的配置,主要是加载ini文件进行初始化工作,具体配置,还请看官网的使用手册(/web.html)init文件不支持与spring的集成。
此处主要是如何与spring及springmvc集成。
1、web.xml中配置shiro过滤器,web.xml中的配置类使用了spring的过滤代理类来完成。
Xml代码2、在spring中的application.xml文件中添加shiro配置:Java代码anon org.apache.shiro.web.filter.authc.AnonymousFilterauthc org.apache.shiro.web.filter.authc.FormAuthenticatio nFilterauthcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenti cationFilterlogout org.apache.shiro.web.filter.authc.LogoutFilternoSessionCrea tion org.apache.shiro.web.filter.session.NoSessionCreati onFilterperms org.apache.shiro.web.filter.authz.PermissionsAuthor izationFilterport org.apache.shiro.web.filter.authz.PortFilterrest org.apache.shiro.web.filter.authz.HttpMethodPermiss ionFilterroles org.apache.shiro.web.filter.authz.RolesAuthorizatio nFilterssl org.apache.shiro.web.filter.authz.SslFilter user erFilter∙∙anon:例子/admins/**=anon 没有参数,表示可以匿名使用。
Shiro学习文档一、shiro入门●Apache Shiro 是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。
●Shiro的功能:认证:验证用户来核实他们的身份授权:对用户执行访问控制,如:判读用户是否被分配了一个确定的安全角色判读用户是否被允许做某事会话管理:在任何环境下使用Session API,即使没有Web或EJB容器。
加密:以更加简洁易用的方式使用加密的功能,保护或隐藏数据防止被偷窥Realms:聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。
启用单点登录(SSO)功能。
为没有关联到登录的用户启用“Remember Me”服务。
●Shiro的四大部分——身份验证,授权,会话管理和加密Authentication:有时也简称为“登录”,这是证明用户是他们所说的他们是谁的行为。
Authorization:访问控制的过程,也就是绝对“谁”去访问“什么”。
Session Management:管理用户特定的会话,即使再非Web或EJB应用程序。
Cryptography:通过使用加密算法保持数据安全同时易于使用。
●Shiro提供的扩展功能:Web Support:主要针对web应用提供一些常用功能。
Caching:缓存可以使应用程序运行更有效率。
Testing:帮助我们进行测试相关功能。
“Run AS”:一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
“Remember Me”:记住用户身份,提供类似购物车功能。
●Shiro的高层概览架构SubjectSubject实质上是一个当前执行用户的特定的安全“视图”。
Subject可以是一个人,也可以是代表第三方服务,或其他类似的任何东西——基本上是当前正与软件进行交互的任何东西。
所以Subject实例都被绑定到(且这是必须的)一个SecurityManager上。
当你与一个Subject交互时,那些交互作用转化为与SecurityManager交互的特定Subject的交互作用。
Shiro框架⼊门Shiro框架⼊门1、认证登录检验待登录的⽤户是否是系统合法⽤户,是,认证通过,不是,就拒绝xml配置⽂件<!-- MyShiroRealm bean 配置--><bean id="myShiroRealm" class="com.hqyj.fj.realm.MyShiroRealm"><property name="credentialsMatcher" ref="credentialsMatcher"></property></bean><!-- 配置shiro核⼼组件 SecurityManager --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- 我们⾃定义的认证域对象注⼊到SecurityManager对象中--><property name="realm" ref="myShiroRealm" /></bean>pom.xml<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.2</version></dependency>java代码package com.hqyj.fj.realm;import com.hqyj.fj.pojo.Role;import er;import erService;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.session.Session;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.util.ByteSource;import org.springframework.beans.factory.annotation.Autowired;import java.util.HashSet;import java.util.Set;/** 认证域* 给shiro框架返回系统中⽤户的认证信息* 给shiro框架返回系统中⽤户的授权信息* */public class MyShiroRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;//给shiro框架返回系统中待认证⽤户的认证信息@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //使⽤认证令牌获取当前待登录的⽤户名String username = (String)token.getPrincipal();//在我们的系统中查询⽤户的认证信息User user = userService.getOneByUsername(username);//如果⽤户不存在,抛出⽤户不存在的异常if(user == null){throw new UnknownAccountException(username+"不存在");}//在shiro会话域中共享⽤户信息,以便业务层获取使⽤Session session = SecurityUtils.getSubject().getSession();session.setAttribute("loginUser", user);//使⽤三个参数的构造⽅法来构造,⽤户名、密码、当前认证域的名称// SimpleAuthenticationInfo info =// new SimpleAuthenticationInfo(username, user.getPassword(), getName());ByteSource saltBytes =ByteSource.Util.bytes(user.getUsername());SimpleAuthenticationInfo info =new SimpleAuthenticationInfo(username, user.getPassword(), saltBytes,getName());System.out.println("获取认证信息");System.out.println(info);return info;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //是下⾯关于授权的代码,可以复制下⾯的//doGetAuthenticationInfo⽅法return null;}}控制层controlle java代码@RequestMapping("/login")@ResponseBodypublic Map<String, Object> login(String username, String password){//检查请求参数if(username == null || password == null){Map<String, Object> result = new HashMap<>();result.put("code",-9);result.put("message","请求参数错误");return result;}//调⽤服务层实现业务return userServie.login(username,password);}@RequestMapping("/logout")@ResponseBodypublic Map<String, Object> logout(){//调⽤服务层实现业务return userServie.logout();}服务层servrce java代码@Overridepublic Map<String, Object> login(String username, String password) {Map<String, Object> result = new HashMap<>();//获取当前⽤户Subject subject = SecurityUtils.getSubject();//判断当前是否已经认证过if(!subject.isAuthenticated()){//创建⼀个认证令牌UsernamePasswordToken token = new UsernamePasswordToken(username,password);//做登录try{subject.login(token);}catch (UnknownAccountException e){//未知账号异常result.put("code", -1);result.put("message",username+"⽤户不存在");return result;}catch (IncorrectCredentialsException e){//密码错误异常result.put("code", -2);result.put("message",username+"⽤户密码错误");return result;}catch (AuthenticationException e){result.put("code",-10);result.put("message","认证失败");return result;return result;}}//认证通过,获取已保存在shiro session域中的⽤户信息Session session = subject.getSession();Object loginUser = session.getAttribute("loginUser");result.put("code", 0);result.put("message",username +"认证成功");//直接返回给控制器⽅法result.put("loginUser",loginUser);return result;}@Overridepublic Map<String, Object> logout() {//使⽤shiro框架获取当前⽤户Subject subject = SecurityUtils.getSubject();//使⽤shiro对当前⽤户登出subject.logout();Map<String, Object> result = new HashMap<>();result.put("code", 0);result.put("message", "成功登出");return result;}核⼼代码讲解2、授权当已认证⽤户系统收收权限时,检查所具有的权限,如果有该资源的访问权限,权限通过,允许访问,反之,拒绝访问xml代码<!-- shiro过滤器,⽤于授权 --><!-- 这⾥的id shiroFilter 和web.xml中配置的代理过滤器的名称⼀致--><!-- 当已经认证的⽤户访问系统资源时,检查所具有的权限如果有访问权限授权通过,允许访问吧,反之,拒绝访问web应⽤收权限--><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager" /><!-- 没有认证过的⽤户,访问受限资源时,shiro直接跳转该配置的url--><property name="loginUrl" value="/index.jsp"></property><!-- 已认证过但是没有访问权限的⽤户访问受限资源时 shiro直接跳转到该处置的url--><property name="unauthorizedUrl" value="/unauthorized.jsp"></property><property name="filterChainDefinitions"><value><!-- 配置过滤器链想要控制url=⾝份信息:anon 匿名⽤户authc 认证通过⽤户roles[⾓⾊名]具有某个⾓⾊的⽤户permes[权限名]具有某个权限的⽤户-->/shiroTag=anon/index.jsp=anon/user/login=anon/shiro/mustauthc=authc/shiro/mustauthc=roles[管理员]/shiro/mustnormal=roles[普通⽤户]/**=authc</value></property></bean>java代码package com.hqyj.fj.realm;import com.hqyj.fj.pojo.Role;import er;import erService;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.session.Session;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.util.ByteSource;import org.springframework.beans.factory.annotation.Autowired;import java.util.HashSet;import java.util.Set;/** 认证域* 给shiro框架返回系统中⽤户的认证信息* 给shiro框架返回系统中⽤户的授权信息* */public class MyShiroRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;//给shiro框架返回系统中待认证⽤户的认证信息@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//是上⾯关于认证的代码,可以复制上⾯的 doGetAuthenticationInfo⽅法;return null;}//给shiro框架返回系统中的信息@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {System.out.println("获取授权信息");String username=(String) principals.getPrimaryPrincipal();System.out.println(username);//获取待授权的⽤户权限信息:⾓⾊信息,和权限信息User user=userService.getOneByUsername(username);//组装⼀个Set<String>⾓⾊信息Set<String> roles=new HashSet<>();//组装⼀个Set<String>权限信息Set<String> perms=new HashSet<>();for (Role role:user.getRoles()){roles.add(role.getName());}//创建⼀个授权⾓⾊信息SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();//赋予⾓⾊权限info.setRoles(roles);//赋予权限相关的授权信息info.setStringPermissions(perms);return info;}}结果登录成功登录失败授权问题3、SessionSession 可以不通过java web 的session对象来实现会话功能,可以使⽤shiro session对象实现会话领域的数据共享问题4、加密登录时的密码,加密散列算法MD5 SHA1 SHA256 明⽂-----》xxxxx32234af455将原⽂的关键字提取出来,⽣成⼀串看不懂的暗⽂信息,从暗⽂信息⽆法还原成原⽂,同MD5 SHA1 SHA256 明⽂-----》xxxxx32234af455将原⽂的关键字提取出来,⽣成⼀串看不懂的暗⽂信息,从暗⽂信息⽆法还原成原⽂,同⼀个原⽂信息转换成唯⼀⼀个暗⽂信息。
apache shiro入门Apache Shiro 是一个框架,可用于身份验证和授权。
本文提供了几个示例用来展示如何在Java™ 应用程序中使用Shiro 并给出了如何在一个Grails web 应用程序中使用它的概述。
为了从本文中最大限度地受益,您应该习惯于创建Java 应用程序并安装了如下的几个组件:●Java 1.6 JDK●Grails(用来运行这些web 应用程序示例)身份验证和授权在对系统进行安全保障时,有两个安全性元素非常重要:身份验证和授权。
虽然这两个术语代表的是不同的含义,但出于它们在应用程序安全性方面各自的角色考虑,它们有时会被交换使用。
身份验证指的是验证用户的身份。
在验证用户身份时,需要确认用户的身份的确如他们所声称的那样。
在大多数应用程序中,身份验证是通过用户名和密码的组合完成的。
只要用户选择了他人很难猜到的密码,那么用户名和密码的组合通常就足以确立身份。
但是,还有其他的身份验证方式可用,比如指纹、证书和生成键。
一旦身份验证过程成功地建立起身份,授权就会接管以便进行访问的限制或允许。
所以,有这样的可能性:用户虽然通过了身份验证可以登录到一个系统,但是未经过授权,不准做任何事情。
还有一种可能是用户虽然具有了某种程度的授权,却并未经过身份验证。
在为应用程序规划安全性模型时,必须处理好这两个元素以确保系统具有足够的安全性。
身份验证是应用程序常见的问题(特别是在只有用户和密码组合的情况下),所以让框架来处理这项工作是一个很好的做法。
合理的框架可提供经过测试和维护的优势,让您可以集中精力处理业务问题,而不是解决其解决方案已经实现的问题。
Apache Shiro 提供了一个可用的安全性框架,各种客户机都可将这个框架应用于它们的应用程序。
本文中的这些例子旨在介绍Shiro 并着重展示对用户进行身份验证的基本任务。
了解ShiroShiro 是一个用Java 语言实现的框架,通过一个简单易用的API 提供身份验证和授权。