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用户手册Shiro架构介绍一、什么是ShiroApache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能:* 认证-用户身份识别,常被称为用户登录”«授权-访问控制;* 密码加密-保护或隐藏数据防止被偷窥;* 会话管理-每用户相关的时间敏感的状态。
对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。
并且相对于其他安全框架, Shiro要简单的多。
Shiro的架构介绍Subject :即当前操作用户”但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Accou nt )或其他类似事物。
它仅仅意味着当前跟软件交互的东西”。
但考虑到大多数目的和用途,你可以把它认为是Shiro的用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager :它是Shiro 框架的核心,典型的Facade 模式,Shiro 通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm : Realm充当了Shiro与应用安全数据间的桥梁”或者连接器”。
也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO :它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。
当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。
配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC )、类似INI的文本配置资源以及属性文件等。
如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
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是一个开源的Java安全框架,它提供了一套强大的身份验证、授权、加密和会话管理的解决方案。
使用Shiro可以轻松地保护应用程序的安全性,提供安全的用户认证和授权功能。
我们需要在项目中引入Shiro的依赖。
可以通过Maven或者手动下载Shiro的jar包来实现。
引入依赖之后,我们需要在项目的配置文件中进行相应的配置。
在配置文件中,我们可以定义Shiro的Realm,Realm是Shiro的核心组件之一,用于进行用户的身份验证和授权。
我们可以自定义一个Realm,继承Shiro的AuthorizingRealm类,并实现其中的方法。
在身份验证方法中,我们可以根据用户输入的用户名和密码,进行数据库查询或其他方式的验证。
在授权方法中,我们可以根据用户的角色和权限信息,判断用户是否有权限进行某些操作。
除了Realm之外,我们还可以配置Shiro的其他组件,如SessionManager、CacheManager等。
SessionManager用于管理用户的会话,可以设置会话的超时时间、会话验证等。
CacheManager用于缓存用户的权限信息,提高系统的性能。
在代码中使用Shiro也非常简单。
首先,我们需要创建一个Subject对象,Subject是Shiro的核心对象之一,用于封装用户的身份信息和操作。
可以通过SecurityUtils.getSubject()方法获取当前用户的Subject对象。
然后,我们可以使用Subject对象进行身份验证和授权操作。
身份验证可以通过调用Subject对象的login()方法来实现,该方法接受一个AuthenticationToken对象作为参数,该对象包含用户输入的身份信息。
在login()方法中,Shiro会调用我们自定义的Realm对象的身份验证方法来进行验证。
如果验证成功,就可以认为用户是合法的,并且可以进行后续的操作。
授权操作可以通过调用Subject对象的checkPermission()或checkRoles()方法来实现,这些方法接受一个String类型的参数,用于指定要进行授权的权限或角色。
Shiro权限管理框架(一):Shiro的基本使用
Shiro权限管理框架(⼀):Shiro的基本使⽤shiro概念:Apache Shiro是⼀个强⼤且易⽤的Java安全框架,执⾏⾝份验证、授权、密码和会话管理。
使⽤Shiro的易于理解的API,您可以快速、轻松地获得任何应⽤程序,从最⼩的移动应⽤程序到最⼤的⽹络和企业应⽤程序。
上⾯这段话来⾃百度百科,没啥⽤。
想要快速理解并使⽤Shiro要先从最重要的三⼤概念⼊⼿。
1. Subject:⼤⽩话来讲就是⽤户(当然并不⼀定是⽤户,也可以指和当前应⽤交互的任何对象),我们在进⾏授权鉴权的所有操作都是围绕Subject(⽤户)展开的,在当前应⽤的任何地⽅都可以通过SecurityUtils的静态⽅法getSubject()轻松的拿到当前认证(登录)的⽤户。
2. SecurityManager:安全管理器,Shiro中最核⼼的组件,它管理着当前应⽤中所有的安全操作,包括Subject(⽤户),我们围绕Subject展开的所有操作都需要与SecurityManager进⾏交互。
可以理解为SpringMVC中的前端控制器。
3. Realms:字⾯意思为领域,Shiro在进⾏权限操作时,需要从Realms中获取安全数据,也就是⽤户以及⽤户的⾓⾊和权限。
配置Shiro,我们⾄少需要配置⼀个Realms,⽤于⽤户的认证和授权。
通常我们的⾓⾊及权限信息都是存放在数据库中,所以Realms也可以算是⼀个权限相关的Dao层,SecurityManager在进⾏鉴权时会从Realms中获取权限信息。
这三个基本的概念简答理解后就可以开始配置和使⽤Shiro了,其实Shiro最基本的使⽤⾮常简单,加⼊依赖后只需要配置两个Bean,再继承⼀个抽象类实现两个⽅法即可。
基本使⽤:引⼊⼀个依赖新建⼀个基于Springboot的Web项⽬,引⼊Shiro依赖。
<!-- https:///artifact/org.apache.shiro/shiro-web --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency>配置两个Bean新建⼀个Shiro配置类,配置Shiro最为核⼼的安全管理器SecurityManager。
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的交互作用。
shiro的使用
shiro的使用
Shiro是一个强大的Java安全框架,可以为Web应用程序、基于RESTful的服务、移动应用程序和独立的Java应用程序提供安全管理功能。
Shiro提供了身份验证、授权、密码学和会话管理等功能,可轻松地集成到现有的应用程序中。
Shiro的使用步骤如下:
1. 添加Shiro依赖
在Maven项目中,可以在pom.xml文件中添加以下依赖:
```
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.1</version>
</dependency>
```
2. 配置Shiro
在项目中添加shiro.ini或shiro.properties文件来配置Shiro。
这些
文件包含了一系列的配置项,如身份验证器、授权器和会话管理器等。
3. 编写代码
编写代码来实现身份验证和授权。
可以使用Shiro提供的API来完成
这些任务。
例如,使用Subject对象来进行身份验证和授权操作。
4. 测试代码
测试代码以确保它们能够正常工作。
可以使用JUnit或其他测试框架
来运行测试。
总之,使用Shiro可以帮助开发人员快速实现安全管理功能,并降低
开发成本和风险。
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针对Shiro使用的入门级介绍,目的是快速开始使用。
阅读本文需要事先有eclipse、maven、spring、springmvc、web应用开发等基础知识。
一、Shiro基本概念:Apache Shiro(日语“堡垒(Castle)”的意思)是一个强大易用的Java 安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障- 从命令行应用、移动应用到大型网络及企业应用。
Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保护应用的API:认证- 用户身份识别,常被称为用户“登录”;授权- 访问控制;密码加密- 保护或隐藏数据防止被偷窥;会话管理- 每用户相关的时间敏感的状态。
Shiro还支持一些辅助特性,如Web应用安全、单元测试和多线程,它们的存在强化了上面提到的四个要素。
Shiro的基本功能如图:二、Shiro基本处理流程及一些主要概念如图:Shiro框架拦截到一个应用请求后,会为此请求建立一个Subject对象,本次Session没关闭时,Subject对象会一直存在,作为一个虚拟的user对象。
对此对象可以进行身份验证(Authentication)和权限验证(Authorization),这些处理将会提交给Shiro的SecurityManager 对象。
简单地理解,SecurityManager是一个总调度,负责接受不同的Subject对象的权限相关的处理请求。
而真正干活的是Realm对象,也就是说最后作身份验证和权限验证的是Realm针对Shiro使用的入门级介绍,目的是快速开始使用。
阅读本文需要事先有eclipse、maven、spring、springmvc、web应用开发等基础知识。
对象。
Shiro的Realm对象不提供用户信息和权限信息,这些信息是Shiro 的使用者要提供的,Realm中定义的各种验证方法和安全数据的容器,使用者是把自己的安全数据装进去。
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
