SpringBoot:集成Shiro之阻拦器配置

作者 : 开心源码 本文共5895个字,预计阅读时间需要15分钟 发布时间: 2022-05-12 共150人阅读

前言


前面的几篇博客都是说的使用户如何认证,如何受权,那么使用户认证受权之后,我们该如何用这些信息呢?这里我们就需要用到Shiro框架中的阻拦器功能.通过阻拦器功能实现使用户权限和角色的应使用,下面我们就来看一下我们如何用阻拦器实现使用户权限认证的应使用.

阻拦器分类说明


在配置阻拦器之前,我们需要先理解Shiro本身给我们提供的阻拦器都有什么,都有着什么样的特点.下面我们就来使用表格的形式来看一下各种阻拦器的特点.

简写(加粗为常使用)名称优先级(1为最高)说明对应Java类
anon匿名阻拦器1不需要登录就能访问,一般使用于静态资源,或者者手机端接口org.apache.shiro.web.filter.authc.AnonymousFilter
authc登录阻拦器2需要登录认证才能访问的资源org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasicHttp阻拦器3Http身份验证阻拦器,非常使用类型,不太理解org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
logout登出阻拦器4使用户登出阻拦器,主要属性:redirectURL退出登录后重定向的地址org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation不创立会话阻拦器5调使用 subject.getSession(false) 不会有什么问题,但是假如 subject.getSession(true) 将抛出 DisabledSessionException 异常org.apache.shiro.web.filter.authc.NoSessionCreationFilter
prems权限阻拦器6验证使用户能否拥有资源权限org.apache.shiro.web.filter.authc.PermissionsAuthorizationFilter
port端口阻拦器7其主要属性: port(80) 假如使用户访问该页面是非 80,将自动将请求端口改为 80 并重定向到该 80 端口org.apache.shiro.web.filter.authc.PortFilter
restrest风格阻拦器8rest 风格阻拦器,自动根据请求方法构建权限字符串构建权限字符串;非常使用类型阻拦器org.apache.shiro.web.filter.authc.HttpMethodPermissionFilter
roles角色阻拦器9验证使用户能否拥有资源角色org.apache.shiro.web.filter.authc.RolesAuthorizationFilter
sslSSL阻拦器10只有请求协议是https才能通过,否则你会自动跳转到https端口(443)org.apache.shiro.web.filter.authc.SslFilter
user使用户阻拦器11使用户阻拦器,使用户已经身份验证 / 记住我登录的都可;org.apache.shiro.web.filter.authc.UserFilter

我们通过上面的表格可以轻松的分别每一种阻拦器的优先级,这样假设某个资源访问同时设置了两个或者者多个阻拦器,我们可以清楚的知道阻拦器的执行顺序,从而方便我们进行少量操作.

INI文件配置阻拦器


我曾经在SpringBoot:集成Shiro之INI配置篇说过[urls]板块.但是,说的不是太详细.在这个板块,我们就来详细的看一下如何用INI文件的形式配置过滤器.

在配置之前,我们还需要重述一下 阻拦器的通配符的写法,如下所示.

?:匹配一个字符*:匹配零个或者多个字符**:匹配零个或者多个路径

而后,我们看一下[urls]板块的示例.这里我只使用到了少量常使用的阻拦器

[urls]#不需要登录/login=anon/static/**=anon#需要登录/home=authc#需要角色/deleteUser = roles["superAdmin"]#需要使用户权限/addUser = perms["user:create"]

但是,我们发现一个问题,假设使用户没有该权限和没有该角色,或者者没有登录的时候,还有登出的时候,我们都需要给他们配置对应的重定向路径.这时候,我们就不能在[urls]板块中用了,我们需要在[main]板块中进行各个情况路径的重定向设置了.示例代码如下所示.

[main]#使用户登录的地址authc.loginUrl = /login#使用户没有对应角色的跳转重指向roles.unauthorizedUrl = /login#使用户没有对应权限的跳转重指向perms.unauthorizedUrl = /login#使用户登出的跳转重指向logout.redirectUrl = /login
注意:INI文件中 [urls] 板块阻拦顺序是从上往下依次执行.

代码形式配置阻拦器


用INI文件配置阻拦器是较为简洁的配置形式,其实质就是通过Bean注入的形式配置阻拦器 接下来我们看一下我们如何通过代码形式配置阻拦器.

因为是用的SpringBoot:集成Shiro之自己设置Realm实现认证受权项目中的代码配置,那么,我们就看一下上一节都配置了什么吧,我们配置了核心安全事务管理器 和自己设置的权限登录器.代码如下所示.

@Configurationpublic class ShiroConfiguration {    //配置核心安全事务管理器    @Bean(name="securityManager")    public DefaultWebSecurityManager securityManager(@Qualifier("myShiroRealm") MyShiroRealm myShiroRealm) {        DefaultWebSecurityManager manager=new DefaultWebSecurityManager();        manager.setRealm(myShiroRealm);        return manager;    }    //配置自己设置的权限登录器    @Bean(name="myShiroRealm")    public MyRealm authRealm() {        MyRealm myShiroRealm=new MyRealm();        return myShiroRealm;    }}

我们继续配置阻拦器板块的代码.整体代码如下所示.

    @Bean(name="shiroFilter")    public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") DefaultWebSecurityManager manager) {        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();        bean.setSecurityManager(manager);        //配置登录的url和登录成功的url以及验证失败的url        bean.setLoginUrl("/login");        bean.setSuccessUrl("/home");        bean.setUnauthorizedUrl("/login");        //配置访问权限        LinkedHashMap<String, String> filterChainDefinitionMap=new LinkedHashMap<>();        filterChainDefinitionMap.put("/loginUser", "anon");        filterChainDefinitionMap.put("/static/*", "anon");        filterChainDefinitionMap.put("/logout*","anon");        bean.setFilterChainDefinitionMap(filterChainDefinitionMap);        return bean;    }

比较过来,仍然发现,用INI文件形式配置阻拦器要比代码形式更加简洁.

阻拦器的简单用


现在我们来拿/html/login = anon/html/home = authc以及设置重定向的authc.loginUrl = /html/login来简单说明一下,具体应该如何用.

我们想让SpringBoot项目支持Html格式的访问,那么我们需要在pom.xml文件中加入如下的Maven依赖.

        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency>

同时,我们要在application.properties文件中配置如下信息.设置HTML的存放路径,

spring.thymeleaf.prefix=classpath:/templates/spring.mvc.view.suffix=.html

目录结构如下所示.

而后,我们把ShiroConfiguration配置文件进行如下的配置.

@Configurationpublic class ShiroConfiguration {    @Bean(name="shiroFilter")    public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") DefaultWebSecurityManager manager) {        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();        bean.setSecurityManager(manager);        //配置登录的url和登录成功的url以及验证失败的url        bean.setLoginUrl("/index");        bean.setSuccessUrl("/home");        bean.setUnauthorizedUrl("/index");        //配置访问权限        LinkedHashMap<String, String> filterChainDefinitionMap=new LinkedHashMap<>();        filterChainDefinitionMap.put("/index", "anon");        filterChainDefinitionMap.put("/home", "authc");        filterChainDefinitionMap.put("/**","anon");        bean.setFilterChainDefinitionMap(filterChainDefinitionMap);        return bean;    }    //配置核心安全事务管理器    @Bean(name="securityManager")    public DefaultWebSecurityManager securityManager() {        DefaultWebSecurityManager manager=new DefaultWebSecurityManager();        return manager;    }}

我们在resources目录下创立两个html页面,一个login.html,一个home.html,其中代码如下所示.

login

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>使用户登录</title></head><body><div style="text-align: center;margin-top: 100px; font-size: 20px;">使用户登录界面</div></body></html>

home

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>主页面</title></head><body><div style="text-align: center;margin-top: 100px; font-size: 20px;">Home界面</div></body></html>

而后我们需要编写两个接口来访问login.html和home.html.这里我创立了一个名为HtmlController的控制器.整体代码较为简单,这里就直接黏贴出所有代码了.如下所示.

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import java.util.Map;@Controllerpublic class HtmlController {    @RequestMapping(value = "/index",method = RequestMethod.GET)    public String userLoginHtmlAction (){        return "index";    }    @RequestMapping(value = "/home",method = RequestMethod.GET)    public String userHomeHtmlAction (){        return "home";    }}

而后我们就会猜想有如下情况出现,假设我们可以直接通过浏览器访问/html/login,那么我们会直接访问到login.html ,但是当我们访问/html/home的时候,因为我们没有进行使用户登录认证(根本就没有做登录接口.??),所以我们不可能通过认证,通过登录重指向,浏览器依然会展现login.html 页面,下面我们就启动项目来验证一下.如下所示,阻拦成功.

结语(未完待续)


Shiro的阻拦器已经配置完成了,下一篇博客我们将来说一下如何在网页中用权限管理标签,欢迎继续关注骚栋.

Demo传送门

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » SpringBoot:集成Shiro之阻拦器配置

发表回复