1. 首页
  2. IT资讯

纯干货,中高级程序员必看之shiro框架应用

“u003Cdivu003Eu003Cpu003E一、Shiro 简介u003Cu002Fpu003Eu003Cpu003EApache Shiro 是一个强大且易用的 Java 安全框架,执行身份验证、授权、密码和会话管理。使用 Shiro 的易于理解的 API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。u003Cu002Fpu003Eu003Cpu003E二、Shiro 授权入门u003Cu002Fpu003Eu003Cpu003E简单介绍完毕 shiro 的作用后,接下来我们就直接进入 shiro 授权的入门,由于我们学习 shiro 重点是在使用,所以我们涉及到 shiro 源码的部分我们就不做过多的关注。u003Cu002Fpu003Eu003Cpu003E2.1:首先我们需要创建一个 maven 的 web 项目,导入 shiro 相关的依赖包和 tomcat 以及 jdk 的编译插件,本次我们使用 shiro 最新的依赖包。u003Cu002Fpu003Eu003Cpu003E大家也可以直接从 maven 的中央仓库找坐标u003Cu002Fpu003Eu003Cpreu003E<groupId>cn.itcast<u002FgroupId>u003Cbru003E<artifactId>shiro_quickStart<u002FartifactId>u003Cbru003E<version>1.0-SNAPSHOT<u002Fversion>u003Cbru003E<packaging>war<u002Fpackaging>u003Cbru003E<properties>u003Cbru003E<project.build.sourceEncoding>UTF-8<u002Fproject.build.sourceEncoding>u003Cbru003E<maven.compiler.source>1.8<u002Fmaven.compiler.source>u003Cbru003E<maven.compiler.target>1.8<u002Fmaven.compiler.target>u003Cbru003E<u002Fproperties>u003Cbru003E<dependencies>u003Cbru003E<dependency>u003Cbru003E<groupId>junit<u002FgroupId>u003Cbru003E<artifactId>junit<u002FartifactId>u003Cbru003E<version>4.11<u002Fversion>u003Cbru003E<scope>test<u002Fscope>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.apache.shiro<u002FgroupId> <artifactId>shiro-core<u002FartifactId>u003Cbru003E<version>1.4.1<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.apache.shiro<u002FgroupId>u003Cbru003E<artifactId>shiro-web<u002FartifactId>u003Cbru003E<version>1.4.1<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<u002Fdependencies>u003Cbru003E<build>u003Cbru003E<plugins>u003Cbru003E<plugin>u003Cbru003E<groupId>org.apache.maven.plugins<u002FgroupId>u003Cbru003E<artifactId>maven-compiler-plugin<u002FartifactId>u003Cbru003E<configuration>u003Cbru003E<source>1.8<u002Fsource>u003Cbru003E<target>1.8<u002Ftarget>u003Cbru003E<u002Fconfiguration>u003Cbru003E<u002Fplugin>u003Cbru003E<plugin>u003Cbru003E<groupId>org.apache.tomcat.maven<u002FgroupId>u003Cbru003E<artifactId>tomcat7-maven-plugin<u002FartifactId>u003Cbru003E<version>2.1<u002Fversion>u003Cbru003E<configuration>u003Cbru003E<port>8989<u002Fport>u003Cbru003E<path>u002F<u002Fpath>u003Cbru003E<uriEncoding>UTF-8<u002FuriEncoding>u003Cbru003E<u002Fconfiguration>u003Cbru003E<u002Fplugin>u003Cbru003E<u002Fplugins>u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E2.2 在项目的 WEB-INF 下去创建一个 shiro 的配置文件 shiro.ini,同时需要在 web.xml 中配置 shiro 核心的过滤器;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fae2ea4e5fa534a8fb72a8a4ed6ee8984″ img_width=”291″ img_height=”241″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E2.2.1 web.xml 中核心过滤器配置u003Cu002Fpu003Eu003Cpreu003E<listener>u003Cbru003E<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener<u002Flistener-class>u003Cbru003E<u002Flistener>u003Cbru003E<filter>u003Cbru003E<filter-name>ShiroFilter<u002Ffilter-name>u003Cbru003E<filter-class>org.apache.shiro.web.servlet.ShiroFilter<u002Ffilter-class>u003Cbru003E<u002Ffilter>u003Cbru003E<filter-mapping>u003Cbru003E<filter-name>ShiroFilter<u002Ffilter-name>u003Cbru003E<url-pattern>u002F*<u002Furl-pattern>u003Cbru003E<dispatcher>REQUEST<u002Fdispatcher>u003Cbru003E<dispatcher>FORWARD<u002Fdispatcher>u003Cbru003E<dispatcher>INCLUDE<u002Fdispatcher>u003Cbru003E<dispatcher>ERROR<u002Fdispatcher>u003Cbru003E<u002Ffilter-mapping>u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E2.2.2 shiro.ini 配置认证u003Cu002Fpu003Eu003Cpu003E简单解释一下,users 是用来配置用户名和密码的,urls 是用来配置认证。u002Fadminu002F**=authc 表示访问项目 admin 下面的所有资源都需要登录认证,而u002Flogin u002Flogin.jsp 表示访问这 2 个资源不需要登录认证;u003Cu002Fpu003Eu003Cpreu003E [main]u003Cbru003E [users] user=user admin=adminu003Cbru003E [urls]u003Cbru003E u002Fadminu002F**=authcu003Cbru003E u002Flogin=anonu003Cbru003E u002Flogin.jsp=anonu003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E2.2.3 编写 LoginServlet 和 login.jspu003Cu002Fpu003Eu003Cpu003E* 在 pom.xml 中引入 Servlet 和 Jsp 的依赖包u003Cu002Fpu003Eu003Cpreu003E<dependency>u003Cbru003E<groupId>javax.servlet<u002FgroupId>u003Cbru003E<artifactId>javax.servlet-api<u002FartifactId>u003Cbru003E<version>3.0.1<u002Fversion>u003Cbru003E<scope>provided<u002Fscope>u003Cbru003E<u002Fdependency> <dependency>u003Cbru003E<groupId>javax.servlet.jsp<u002FgroupId>u003Cbru003E<artifactId>jsp-api<u002FartifactId>u003Cbru003E<version>2.1<u002Fversion>u003Cbru003E<scope>provided<u002Fscope>u003Cbru003E<u002Fdependency>u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E* 创建 LoginServlet 和 login.jspu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F6d86d5ee123b48a2b142e28c1d31d270″ img_width=”720″ img_height=”385″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F13783db8f43a44e8acb96fcd27cbb5cc” img_width=”419″ img_height=”145″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E*启动测试:u003Cu002Fpu003Eu003Cpu003E当我们访问 u002Fu002Flocalhost:8989u002Fadminu002Faa,由于需要登录认证,所以跳转到了登录页面;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fdd89b71e985745f08864eea9284f0a97″ img_width=”387″ img_height=”63″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E三、Shiro 入门配置细节u003Cu002Fpu003Eu003Cpu003E上一讲当我们访问u002Fu002Flocalhost:8989u002Fadminu002Faa,由于访问的资源需要登录认证跳转到了 login.jsp;为什么跳转到 login.jsp 页面了呢?u003Cu002Fpu003Eu003Cpu003E原因是 shiro 使用了一些内置的过滤器;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F6f7682271ab847db992b8b9600bb820c” img_width=”253″ img_height=”154″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E我们可以通过查阅u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fb559a799a22a47bbbd670efb76e0f53c” img_width=”477″ img_height=”31″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E源码,发现如果没有登录,自动跳转到 login.jspu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F8609c36974ed46deafde81b824efabad” img_width=”488″ img_height=”179″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E3.1 如何去配置登录页面;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F43233aedf2d8422b9872e9bca3ba0fa8″ img_width=”451″ img_height=”206″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E3.2 如何让 shiro 完成登录认证(判断页面传入的用户名密码是正确的)u003Cu002Fpu003Eu003Cpu003E3.2.2 修改 login.jsp,加入表单,已经表单提交的地址u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Ff57461e9d7b04ecc9ce227932fef958b” img_width=”501″ img_height=”107″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E3.2.3 在 LoginServlet 完成登录认证u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fab883a2d3264413aa8c1c3847cc25e4b” img_width=”608″ img_height=”335″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E四、Shiro 授权入门u003Cu002Fpu003Eu003Cpu003EShiro 除了可以完成认证外,也可以进行授权,即登录用户只有拥有指定的角色才能访问指定的资源;u003Cu002Fpu003Eu003Cpu003E4.1 修改 shiro.ini 文件,加入角色及授权。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F6e78ea1280844cf494e874b16ee336eb” img_width=”353″ img_height=”287″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E4.2 [roles]中可以配置系统中的角色,此处我们定义了 2 个角色,一个角色为 ROLE_USER,一个为 ROLE_ADMINu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F5f1ba8b9c33e471783b22c39edbed46c” img_width=”199″ img_height=”52″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E4.3[users]中除了可以配置登录的用户外,还可以给用户分配角色。此处我们定义 user 用户的角色为 ROLE_USER,admin 用户的角色为ROLE_ADMIN;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F7802970c0edb48a6ba6b546240605319″ img_width=”208″ img_height=”49″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E4. 4[urls]中除了可以配置资源访问是否需要登录认证,还可以配置登录用户访问资源需要哪些角色。此处我们定义访问u002Fadmin 下面的所有资源,除了需要登录,登录用户还需要有 ROLE_USER 角色;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F5094126506ee4811936c037140bcd3cc” img_width=”268″ img_height=”78″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E4.5 测试我们发现如果使用 useru002Fuser 用户名和密码进行登录,登录成功后可以访问到u002Fadminu002Fadd.jspu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F5f841c4bb2ee4ed090e599540724511f” img_width=”399″ img_height=”158″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E而如果使用 adminu002Fadmin 用户名和密码进行登录登录成功后出现 401 的错误;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fc36fd973ed2f440e8e727375f5a60953″ img_width=”424″ img_height=”122″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E五、Shiro 认证流程和自定义 Realmu003Cu002Fpu003Eu003Cpu003E5.1 前 2 个章节我们已经讲解完毕,认证和授权的入门,接下来我们讲解认证流程;首先我们先来看一张图,授权流程图u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F3bb4cff5d85d45269a23503aab610114″ img_width=”397″ img_height=”280″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E流程:u003Cu002Fpu003Eu003Cpu003E1、当我们调用 Subject.login(token)进行登录,他会会自将 token 交由给 Security Manager,所以我们需要在调用 login 之前,在u003Cu002Fpu003Eu003Cpu003ESecurityUtils. setSecurityManager()设置 Security Manager;u003Cu002Fpu003Eu003Cpu003E2.SecurityManager 他会调用 Authenticator 进行用户名和密码的认证;u003Cu002Fpu003Eu003Cpu003E3、Authenticator 才是真正的身份验证者,Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回u002F 抛出异常表示认证失败了。u003Cu002Fpu003Eu003Cpu003E对于开发者来说;SecurityManager 和 Authenticator 都由 shiro 开发好了,当然他也提供了自己提供的一些 Realm 来获取用户名和密码;u003Cu002Fpu003Eu003Cpu003E默认情况下 shiro 使用的是 initRealm(shiro.ini 配置文件中配置的用户名和密码)进行同户名和密码的获取,我们也可以自己定义 Realm 来获取u003Cu002Fpu003Eu003Cpu003E用户名和密码完成认证;u003Cu002Fpu003Eu003Cpu003E5.2:自定义 Realmu003Cu002Fpu003Eu003Cpreu003Epackage cn.itcast.realm;u003Cbru003Eimport org.apache.shiro.authc.*; import org.apache.shiro.realm.Realm;u003Cbru003Epublic class StaticRealm implements Realm {u003Cbru003E@Overrideu003Cbru003Epublic String getName() {u003Cbru003Eu002Fu002F指定Realm的名称u003Cbru003Ereturn “staticRealm”;u003Cbru003E}u003Cbru003E@Overrideu003Cbru003Epublic boolean supports(AuthenticationToken token) {u003Cbru003Eu002Fu002F该Realm支持的Token类型u003Cbru003Ereturn token instanceof UsernamePasswordToken;u003Cbru003E}u003Cbru003E@Overrideu003Cbru003Epublic AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throwsu003Cbru003EAuthenticationException {u003Cbru003Eu002Fu002F获取token中的用户名和密码u003Cbru003EString username = String.valueOf(token.getPrincipal());u003Cbru003EString password = new String((char[]) token.getCredentials());u003Cbru003Eu002Fu002F如果用户名密码不是gangu002F123抛出异常,认证失败u003Cbru003Eif(!username.equals(“gang”) || !password.equals(“123”)) { throw new AuthenticationException(“用户名或者密码有误”);u003Cbru003E}u003Cbru003Ereturn new SimpleAuthenticationInfo(username,password,getName());u003Cbru003E}u003Cbru003E}u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E5.3 在 shiro.ini 中配置自定义的 Realmu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fffc708dee04c4afaa5403209d9736c1b” img_width=”382″ img_height=”310″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E5.4 测试自定义 Realmu003Cu002Fpu003Eu003Cpu003E经过测试我们发现原来的 iniRealm 就不再起作用,起作用的就是我们自定义的 Realm。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fce991856ced54ed18670d21489c9f2fe” img_width=”431″ img_height=”81″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E5.5 我们在定义 Realm 的时候除了可以实现 Realm 接口也使用它已经实现的一些类;Realm 的体系结构如下;u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Feb0ebf395b1f4d7893729f48876a7bf8″ img_width=”603″ img_height=”421″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E其中 JdbcRealm 可以完成基于数据库的认证;u003Cu002Fpu003Eu003Cpu003E5.6、使用 JdbcRealm 来完成基于数据库的认证;u003Cu002Fpu003Eu003Cpu003E5.6.1 导入 MySQL 驱动及连接池的依赖包,我们本次使用 Druid 连接池u003Cu002Fpu003Eu003Cpreu003E<dependency>u003Cbru003E<groupId>com.alibaba<u002FgroupId>u003Cbru003E<artifactId>druid<u002FartifactId>u003Cbru003E<version>1.0.14<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>mysql<u002FgroupId>u003Cbru003E<artifactId>mysql-connector-java<u002FartifactId>u003Cbru003E<version>5.1.35<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E5.6.2 在 mysql 中创建 2 张数据库表、u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F2ee3c8decb194ba59817b1787e45ebc7″ img_width=”520″ img_height=”207″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E表结构必须和 JdbcRealm 中发送 SQL 语句的表结构一致;u003Cu002Fpu003Eu003Cpu003E表 1:用户表、用来存储用户名和密码u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F4826974d1bd9456bbfd48603f141752b” img_width=”519″ img_height=”145″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E表 2:角色表、用来存储用户的角色信息u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Ff4bf4b11c2404c51a3e810eaf90d8b52″ img_width=”466″ img_height=”139″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E5.6.3 在 shiro.ini 中配置 JdbcRealmu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fc71bf2a3dbb24f7d8cf98687ae8ecd05″ img_width=”533″ img_height=”376″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E5.6.4:测试u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F24838449d8ca443cb8b357857fd76274″ img_width=”447″ img_height=”84″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E六、Shiro 授权流程u003Cu002Fpu003Eu003Cpu003E6.1 上一讲我们给大家讲解了 Shiro 认证的流程,主要就是如何自定义 Realm,接下来我们要讲解的就是授权;首先我们看一张图授权流程图u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fbb0cbc0bbf6c413ab62191a4f9add813″ img_width=”481″ img_height=”330″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E流程如下:u003Cu002Fpu003Eu003Cpu003E1.首先当我们去调用 Subject.isPermitted*u002FhasRole*,他会调用 SecurityManager,而 SecurityManager 接着会调用 Authorizer 授权管理器;u003Cu002Fpu003Eu003Cpu003E2.Authorizer 是真正的授权者,如果我们调用如 isPermitted(“user:view”),其首先会通过 PermissionResolver 把字符串转换成相应的u003Cu002Fpu003Eu003Cpu003EPermission 实例;u003Cu002Fpu003Eu003Cpu003E3.在进行授权之前,其会调用相应的 Realm 获取 Subject 相应的角色u002F权限用于匹配传入的角色u002F权限;u003Cu002Fpu003Eu003Cpu003E4.Authorizer 会判断 Realm 的角色u002F权限是否和传入的匹配,如果有多个 Realm,会调用 ModularRealmAuthorizer 进行循环判断,如果匹配如 isPermitted*u002FhasRole*会返回 true,否 则返回 false 表示授权失败。u003Cu002Fpu003Eu003Cpu003E6.2 接下来我们通过一个入门案例,进行一个直观的感受;u003Cu002Fpu003Eu003Cpu003E6.2.2 首先我们先切换到 initRealm,注释掉 jdbcRealm。给 useru002Fuser 指定 ROLE_USER 角色、给 adminu002Fadmin 指定 ROLE_ADMIN 的角色u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fe96bfc6fd49c431c92c35f1e496b552d” img_width=”355″ img_height=”306″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E6.2.3 在用户登录成功后判断其是否有对应的角色u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F8f7e60867baa4d41a9be66fec525f37b” img_width=”433″ img_height=”242″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E6.2.4 通过测试我们发现如果使用 adminu002Fadmin 登录,打印的是 true。u003Cu002Fpu003Eu003Cpu003E如果使用 useru002Fuser 登录,打印的是 false。u003Cu002Fpu003Eu003Cpu003E6.2.5 除了可以配置角色外,我们还可以配置权限;接下来我们来配置权限u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fc7537182e05843d6bf3e0f09625c7c3e” img_width=”468″ img_height=”245″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003EROLE_USER=user:* 、u003Cu002Fpu003Eu003Cpu003E表示 ROLE_USER 角色拥有 user:*的权限,*表示任意u003Cu002Fpu003Eu003Cpu003EROLE_ADMIN=admin:*,user:*u003Cu002Fpu003Eu003Cpu003E表示 ROLE_AMIN 角色拥有 admin:*和 user:*的权限,*表示任意u003Cu002Fpu003Eu003Cpu003Eu002Fresu002Fupdate.jsp=perms[user:add]u003Cu002Fpu003Eu003Cpu003E表示访问u002Fadminu002Fupdate.jsp 需要登录,并且需要 user:add 权限;u003Cu002Fpu003Eu003Cpu003E通过测试我们发现u003Cu002Fpu003Eu003Cpu003Euseru002Fuser 和 useru002Fadmin 登录后都可以访问u002Fresu002Fupdate.jsp 资源但是 adminu002Fadmin 不能访问u002Fadminu002F**下面的资源u003Cu002Fpu003Eu003Cpu003E6.2.6自定义Realm完成认证和授权。要想使用自定义Relam 完成认证和授权,建议继承AuthorizingRealmu003Cu002Fpu003Eu003Cpreu003Epublic class MyAuthorizingRealm extends AuthorizingRealm {u003Cbru003Eu002F**u003Cbru003E* 该方法是进行授权的u003Cbru003E* @param principalsu003Cbru003E* @returnu003Cbru003E*u002F @Overrideu003Cbru003Eprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {u003Cbru003ESimpleAuthorizationInfo info = new SimpleAuthorizationInfo();u003Cbru003Eu002Fu002F给登陆用户指定角色USER_ROLEu003Cbru003Einfo.addRole(“ROLE_ADMIN”);u003Cbru003Eu002Fu002F给登录用户指定权限u003Cbru003Einfo.addStringPermission(“user:add”);u003Cbru003Ereturn info;u003Cbru003E}u003Cbru003Eu002F**u003Cbru003E* 该方法是用来进行认证的u003Cbru003E*u002F @Overrideu003Cbru003Eprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {u003Cbru003EString username = (String) token.getPrincipal();u003Cbru003EString password = new String((char[]) token.getCredentials());u003Cbru003Eu002Fu002F如果用户名密码是gangu002F123u003Cbru003Eif(username.equals(“gang”) && password.equals(“123”)) { return new SimpleAuthenticationInfo(username, password, getName());u003Cbru003E}else { throw new AuthenticationException(“用户名或者密码错误”);u003Cbru003E}u003Cbru003E}u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E6.2.6 配置自定义 Realmu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fc892ea565d0946a3be9eba4224a6a089″ img_width=”392″ img_height=”279″ alt=”纯干货,中高级程序员必看之shiro框架应用” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E6.2.6 测试;使用 gangu002Fli 登录后拥有角色 ROLE_ADMIN 和权限 user:add.不能访问u002Fadminu002Fadd.jsp 但是可以访问u002Fresu002Fupdate.jspu003Cu002Fpu003Eu003Cpu003E七、Spring 整合 shirou003Cu002Fpu003Eu003Cpu003E在实际开发中我们通常都不会单独使用 shiro,都是和 spring 进行整合,接下来我们要完成 spring 和 shiro 整合;u003Cu002Fpu003Eu003Cpu003E7.1:u003Cu002Fpu003Eu003Cpu003E导入 spring 和 shiro 整合相关依赖包u003Cu002Fpu003Eu003Cpreu003E<dependency>u003Cbru003E<groupId>org.apache.shiro<u002FgroupId> <artifactId>shiro-spring<u002FartifactId>u003Cbru003E<version>1.4.1<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.springframework<u002FgroupId>u003Cbru003E<artifactId>spring-web<u002FartifactId>u003Cbru003E<version>5.0.5.RELEASE<u002Fversion>u003Cbru003E<u002Fdependency> <dependency>u003Cbru003E<groupId>org.apache.shiro<u002FgroupId> <artifactId>shiro-spring<u002FartifactId>u003Cbru003E<version>1.4.1<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E7.2:编写 spring 的配置文件 applicationContext.xmlu003Cu002Fpu003Eu003Cpreu003E<?xml version=”1.0″ encoding=”UTF-8″?>u003Cbru003E<beans xmlns=”http:u002Fu002Fwww.springframework.orgu002Fschemau002Fbeans”u003Cbru003Exmlns:xsi=”http:u002Fu002Fwww.w3.orgu002F2001u002FXMLSchema-instance” xsi:schemaLocation=”http:u002Fu002Fwww.springframework.orgu002Fschemau002Fbeans http:u002Fu002Fwww.springframework.orgu002Fschemau002Fbeansu002Fspring-beans.xsd”>u003Cbru003E<!–配置自定义Releam–>u003Cbru003E<bean id=”myAuthorizingRealm” class=”cn.itcast.realm.MyAuthorizingRealm”><u002Fbean>u003Cbru003E<!–配置认证管理器–>u003Cbru003E<bean id=”securityManager” class=”org.apache.shiro.web.mgt.DefaultWebSecurityManager”>u003Cbru003E<property name=”realm” ref=”myAuthorizingRealm”><u002Fproperty>u003Cbru003E<u002Fbean>u003Cbru003E<!–配置shiro的过滤器–>u003Cbru003E<bean id=”shiroFilter” class=”org.apache.shiro.spring.web.ShiroFilterFactoryBean”> <property name=”securityManager” ref=”securityManager”u002F>u003Cbru003E<!–登录页面–>u003Cbru003E<property name=”loginUrl” value=”u002Flogin.jsp”u002F>u003Cbru003E<!–登录成功后,跳转的页面–>u003Cbru003E<property name=”successUrl” value=”u002Fadminu002Fadd.jsp”u002F>u003Cbru003E<!–未授权的页面–>u003Cbru003E<property name=”unauthorizedUrl” value=”u002F401.jsp”u002F> <property name=”filterChainDefinitions”> <value>u003Cbru003Eu002Fadminu002F**=authc,roles[ROLE_USER]u003Cbru003Eu002Flogin=anonu003Cbru003Eu002Fresu002Fupdate.jsp=perms[user:add]u003Cbru003Eu002Flogout=logoutu003Cbru003E<u002Fvalue>u003Cbru003E<u002Fproperty>u003Cbru003E<u002Fbean>u003Cbru003E<u002Fbeans>u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E7.2 在 web.xml 中使用 ContextLoaderListener 加载 spring 的配置文件.u003Cu002Fpu003Eu003Cpreu003E<!–加载spring的配置文件–>u003Cbru003E<listener>u003Cbru003E<listener-class>org.springframework.web.context.ContextLoaderListener<u002Flistener-class>u003Cbru003E<u002Flistener>u003Cbru003E<context-param>u003Cbru003E<param-name>contextConfigLocation<u002Fparam-name>u003Cbru003E<param-value>classpath:applicationContext.xml<u002Fparam-value>u003Cbru003E<u002Fcontext-param>u003Cbru003E<!–配置shiro的代理过滤器–>u003Cbru003E<filter>u003Cbru003E<filter-name>shiroFilter<u002Ffilter-name>u003Cbru003E<filter-class>org.springframework.web.filter.DelegatingFilterProxy<u002Ffilter-class> <init-param>u003Cbru003E<param-name>targetFilterLifecycle<u002Fparam-name>u003Cbru003E<param-value>true<u002Fparam-value>u003Cbru003E<u002Finit-param>u003Cbru003E<u002Ffilter>u003Cbru003E<filter-mapping>u003Cbru003E<filter-name>shiroFilter<u002Ffilter-name>u003Cbru003E<url-pattern>u002F*<u002Furl-pattern>u003Cbru003E<u002Ffilter-mapping>u003Cbru003Eu003Cu002Fpreu003Eu003Cpu003E学习资料:u003Cu002Fpu003Eu003Cpu003Eu003Ca class=”pgc-link” data-content=”mp” href=”http:u002Fu002Fyun.itheima.comu002Fopenu002F283.html?jrtt” target=”_blank”u003E权限管理实战:SpringBoot与Shiro整合u003Cu002Fau003Eu003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:纯干货,中高级程序员必看之shiro框架应用

主题测试文章,只做测试使用。发布者:程序员,转转请注明出处:http://www.cxybcw.com/26744.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code