SpringBoot整合Shiro之拦截器配置

SpringBoot整合Shiro之拦截器配置

 

springboot整合shiro应用

https://www.cnblogs.com/ll409546297/p/7815409.html

1、Shiro是Apache下的一个开源项目,我们称之为Apache Shiro。它是一个很易用与Java项目的的安全框架,提供了认证、授权、加密、会话管理,与spring Security 一样都是做一个权限的安全框架,但是与Spring Security 相比,在于 Shiro 使用了比较简单易懂易于使用的授权方式。shiro属于轻量级框架,相对于security简单的多,也没有security那么复杂。所以我这里也是简单介绍一下shiro的使用。

2、非常简单;其基本功能点如下图所示:

Authentication身份认证/登录,验证用户是不是拥有相应的身份;

Authorization授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;

Session Manager会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;

Cryptography加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;

Web SupportWeb支持,可以非常容易的集成到Web环境;

Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;

Concurrencyshiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;

Testing提供测试支持;

Run As允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;

Remember Me记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

记住一点,Shiro不会去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro即可。

 

SpringBoot:集成Shiro之拦截器配置

https://www.jianshu.com/p/3671b97aab3d

前言


前面的几篇博客都是说的用户如何认证,如何授权,那么用户认证授权之后,我们该如何使用这些信息呢?这里我们就需要使用到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实现认证授权项目中的代码配置,那么,我们就看一下上一节都配置了什么吧,我们配置了核心安全事务管理器 和自定义的权限登录器.代码如下所示.

@Configuration
public 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配置文件进行如下的配置.

@Configuration
public 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;

@Controller
public 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传送门

 

 

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,可以通过整合Shiro来实现对请求的拦截和权限控制。如果不希望Shiro拦截某个请求,可以通过配置Shiro的过滤器链来实现。 首先,在Spring Boot的配置类中,需要注入一个FilterRegistrationBean对象来配置Shiro的过滤器链。然后,通过调用FilterRegistrationBean的addInitParameter方法,设置Shiro过滤器的init参数。 在设置Shiro过滤器的init参数时,可以通过使用Shiro内置的过滤器来达到不拦截某个请求的目的。其中,"anon"代表不需要认证即可访问,"authc"代表需要认证才能访问。 示例代码如下: @Configuration public class ShiroConfig { @Bean public FilterRegistrationBean<DelegatingFilterProxy> shiroFilterRegistration() { FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<>(); registration.setFilter(new DelegatingFilterProxy("shiroFilter")); Map<String, String> initParameters = new LinkedHashMap<>(); // 不拦截某个请求 initParameters.put("anon", "/path/to/skip"); // 其他需要认证的请求 initParameters.put("authc", "/path/to/authenticate"); registration.setInitParameters(initParameters); registration.setOrder(1); registration.addUrlPatterns("/*"); return registration; } // 其他Shiro配置省略... } 在上述代码中,通过设置initParameters来指定需要拦截的请求与需要认证的请求。其中,"/path/to/skip"代表不需要进行认证和授权的请求路径。 通过以上配置,可以实现Spring Boot与Shiro整合,并使得Shiro拦截某个特定的请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值