shiro入门学习课件
SSH学习笔记1Shiro入门

11
12
//将安全管理器对象绑定到 SecurityUtils工具类
13
SecurityUtils.setSecurityManager(securityManager);
14
15
16
// get the currently executing user:
17
//通过 SecurityUtils获取到Subject 实例:代表的是当前用户
33
//将用户名和密码封装到 UsernamePasswordToken(身份令牌)
34
UsernamePasswordToken token = new UsernamePasswordToken("root",
18
Subject currentUser = SecurityUtils.getSubject();
19
20
// Do some stuff with a Session (no need for a web or EJB
container!!!)
21
//模拟Session操作
22
Session session = currentUser.getSession();
1 @RequestMapping:请求映射的:将请求的路径和指定的方法进行关联(映射) 2 @GetMapping:get请求,@PostMapping:post请求,@PutMapping:put请
求,@DeleteMapping:delete请求 3 @ResponseBody:用在方法前面,将结果转换成json格式 4 @RequestBody:用在参数前面,只能将前端发过来的json格式字符串,转成java对象 5 @RequestParam:用在参数前面,等同于:request.getParameter("name") 6 7 @JsonFormat:将返回的json数据中的日期类型进行格式化处理 8 @DateTimeFormat:用在实体的日期类型的字段上,用来接收前面传过来的字符串类型的日期,
shiro入门教程

一、介绍: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学习文档一、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的交互作用。
2.shiro认证流程与入门实例

SecurityManagersecurityManager=factorurityManager
SecurityUtils.setSecurityManager(securityManager);
<version>4.12</version>
</dependency>
</dependencies>
</project>
项目结构及依赖如下:
4.添加shiro-helloworld.ini配置文件
shiro-helloworld.ini
[users]
bjsxt=111111
ps:ini文件默认使用操作系统的文本编辑器打开。可如下配置:
subject.login(token);
}catch(AuthenticationExceptione) {
//TODOAuto-generated catch block
e.printStackTrace();
}
//得到认证的结果
booleanisAuthenticated=subject.isAuthenticated();
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjsxt</groupId>
importorg.junit.Test;
publicclassShiroTest {
/**
Shiro框架入门

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将原⽂的关键字提取出来,⽣成⼀串看不懂的暗⽂信息,从暗⽂信息⽆法还原成原⽂,同⼀个原⽂信息转换成唯⼀⼀个暗⽂信息。
shiro框架培训讲义

其他组件:
• 除了以上几个组件外,Shiro还有几个其他 组件: • 1、SessionManager :Shiro为任何应用提供 了一个会话编程范式。 • 2、CacheManager :对Shiro的其他组件提供 缓存支持。
Shiro 完整架构图
实例
• 以新研工系统为例: • Springboot+shiro • <shiro.version>1.4.0</shiro.version>
处理流程
• 1.依赖的包 • shiro-core,shiro-spring,shiro-ehcache • 2.定义shiro拦截器 • ShiroDbRealm extends AuthorizingRealm • 实现登录验证和赋予角色权限
配置
• • • 3.配置 ShiroConfig URL过滤器配置说明: Shiro可以通过配置文件实现基于URL的授权验证。FilterChain定义格式: URL_Ant_Path_Expression = Path_Specific_Filter_Chain 每个URL配置,表示匹配该URL的应用程序请求将由对应的过滤器进行验证。 例如: [urls] /index.html = anon /user/create = anon /user/** = authc /admin/** = authc, roles[administrator] /rest/** = authc, rest /remoting/rpc/** = authc, perms["remote:invoke"] URL表达式说明 1、URL目录是基于HttpServletRequest.getContextPath()此目录设置 2、URL可使用通配符,**代表任意子目录 3、Shiro验证URL时,URL匹配成功便不再继续匹配查找。所以要注意配置文件中的URL顺序,尤其在使用通 配符时。 Filter Chain定义说明 1、一个URL可以配置多个Filter,使用逗号分隔 2、当设置多个过滤器时,全部验证通过,才视为通过 3、部分过滤器可指定参数,如perms,roles
shiro入门学习PPT课件
3.Authenticator(org.apache.shiro.authc.Authenticator): 登录控制
注:Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy) 如果存在多个realm,则接口AuthenticationStrategy会确定什 么样算是登录成功(例如,如果一个Realm成功,而其他的 均失败,是否登录成功?)。
2021/7/23
8
4.Authorizer(org.apache.shiro.authz.Authorizer) : 决定subject能拥有什么样角色或者权限。
5.SessionManager(org.apache.shiro.session.SessionManager) : 创建和管理用户session。通过设置这个管理器,shiro可以在 任何环境下使用session。
•
"Run As":一个允许用户假设为另一个用
户身份(如果允许)的功能,有时候在管理脚
本很有用。
•
“Remember Me”:记住用户身份,提供
类似购物车功能。
2021/7/23
4
Subject:
Subject 是与程序进行交互的对象,可以是人也可以是服务或者其他,通常就理解 为用户。
所有Subject 实例都必须绑定到一个SecurityManager上。我们与一个 Subject 交 互,运行时shiro会自动转化为与 SecurityManager交互的特定 subject的交互。
8.Realms(org.apache.shiro.realm.Realm) : 程序与安全数据的桥梁
shiro入门学习
小结:
1.Subject(org.apache.shiro.subject.Subject): 简称用户
2.SecurityManager(org.apache.shiro.mgt.SecurityManager) 如上所述,SecurityManager是shiro的核心,协调shiro的各个
Realms:
Realms在 Shiro中作为应用程序和安全数据之间的“桥梁”或“连接器”。 他获取安全数据来判断subject是否能够登录,subject拥有什么权限。 他有点类似DAO。在配置realms时,需要至少一个realm。而且Shiro提 供了一些常用的 Realms来连接数据源,如LDAP数据源的 JndiLdapRealm,JDBC数据源的JdbcRealm,ini文件数据源的IniRealm, properties文件数据源的PropertiesRealm,等等。我们也可以插入自己 的 Realm实现来代表自定义的数据源。 像其他组件一样,Realms也是 由SecurityManager控制
组件
3hiro.authc.Authenticator): 登录控制
注:Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy) 如果存在多个realm,则接口AuthenticationStrategy会确定什 么样算是登录成功(例如,如果一个Realm成功,而其他的 均失败,是否登录成功?)。
8.Realms(org.apache.shiro.realm.Realm) : 程序与安全数据的桥梁
二,简单配置
注:这里只介绍spring配置模式。
因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini 配置无法与spring整合。而且两种配置方法一样,只是格 式不一样。
apache shiro入门
apache shiro入门Apache Shiro 是一个框架,可用于身份验证和授权。
本文提供了几个示例用来展示如何在Java™ 应用程序中使用Shiro 并给出了如何在一个Grails web 应用程序中使用它的概述。
为了从本文中最大限度地受益,您应该习惯于创建Java 应用程序并安装了如下的几个组件:●Java 1.6 JDK●Grails(用来运行这些web 应用程序示例)身份验证和授权在对系统进行安全保障时,有两个安全性元素非常重要:身份验证和授权。
虽然这两个术语代表的是不同的含义,但出于它们在应用程序安全性方面各自的角色考虑,它们有时会被交换使用。
身份验证指的是验证用户的身份。
在验证用户身份时,需要确认用户的身份的确如他们所声称的那样。
在大多数应用程序中,身份验证是通过用户名和密码的组合完成的。
只要用户选择了他人很难猜到的密码,那么用户名和密码的组合通常就足以确立身份。
但是,还有其他的身份验证方式可用,比如指纹、证书和生成键。
一旦身份验证过程成功地建立起身份,授权就会接管以便进行访问的限制或允许。
所以,有这样的可能性:用户虽然通过了身份验证可以登录到一个系统,但是未经过授权,不准做任何事情。
还有一种可能是用户虽然具有了某种程度的授权,却并未经过身份验证。
在为应用程序规划安全性模型时,必须处理好这两个元素以确保系统具有足够的安全性。
身份验证是应用程序常见的问题(特别是在只有用户和密码组合的情况下),所以让框架来处理这项工作是一个很好的做法。
合理的框架可提供经过测试和维护的优势,让您可以集中精力处理业务问题,而不是解决其解决方案已经实现的问题。
Apache Shiro 提供了一个可用的安全性框架,各种客户机都可将这个框架应用于它们的应用程序。
本文中的这些例子旨在介绍Shiro 并着重展示对用户进行身份验证的基本任务。
了解ShiroShiro 是一个用Java 语言实现的框架,通过一个简单易用的API 提供身份验证和授权。
shiro教程
看不清?换一张
</a>
SHIRO应用案例
2. 此处是springMVC里面的一个controller,里面实现了验 证码生成逻辑:
@RequestMapping(value="/vcode",method=RequestMethod.GET) public String createValidationCode(HttpServletRequest
<value>
<!-- 匿名过滤器,跳过登陆检查 -->
/vcode = anon
<!-- /${resource.static.location}/** = anon-->
/html/resources/** = anon
/casFailure.jsp = anon
<!-- 用户过滤器,检查用户是否登陆 -->
<version>1.2.2</version>
</dependency>
</dependencies>
SHIRO简介
如果需要在web项目中,导入:shiro-webxxx.jar. 此包中包括了一些web项目中应用 shiro的工具类
如果需要在spring项目中,导入:shirospring-xxx.jar
Subject.Login: Shiro接口API,身份校验入口。 此处会经过一系列调用栈最终从自定义Realm 接口获取身份信息
Catch: 此处捕获校验失败的处理,自定义
SHIRO应用案例
自定义Realm中: /** * 获取验证信息. * */ @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken authToken) throws AuthenticationException { BossToken token = (BossToken) authToken; //可以在此处校验验证码是否匹配 BossUser user = bossUserService.findBossUserByUserCode(token.getUsername()); if(user==null){ throw new AuthenticationException(new BossErrorException(new