jwt和spring security集成

1、用户登陆,通过spring security验证用户(WebSecurityConfigurerAdapter的configure(AuthenticationManagerBuilder)方法),并且进行授权(WebSecurityConfigurerAdapter的configure(HttpSecurity))。并且根据拦截器,不需要对其验证token。

验证:

public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
            // 设置 UserDetailsService
            .userDetailsService(userDetailsService)
            // 使用 BCrypt 进行密码的 hash
            .passwordEncoder(passwordEncoder());
}    

授权:

public void configure(HttpSecurity http) throws Exception {

  http   // Un-secure 登录、 验证码接口,不用授权就可以无条件访问,也就是所有人都可以访问登陆接口
            .antMatchers(
                    "/api/auth/**",
                    "/alogin"
            ).permitAll() //无条件允许访问
            // secure other api
            .anyRequest().authenticated();}

2、验证通过后,需要通过Jwt功能,生成token,并将token返回给客户端,客户端将token保存在cookie或者localstorage中

//生成token
String token = jwtUtils.generateToken(userId);

3、客户登陆成功后再次访问服务,携带在token(将其放在请求头Authorization字段中),请求服务端。

4、 由于登陆成功后,再次请求服务端,是通过携带token通过jwt验证,而不是通过用户名密码的形式通过spring security验证,所以需要通过自定义过滤器,验证token是否正确

public void configure(HttpSecurity http) throws Exception {

// 将token验证添加在用户名密码验证前面,authenticationTokenFilterBean()方法返回了自定义的过滤器,用来验证token是否正确//其实这部分是验证的内容,但是写在了httpSecurity授权中,为什么这么设计
    httpSecurity
            .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);}

说明:

HttpSecurity 的addFilterBefore方法:

addFilterBefore

public HttpSecurity addFilterBefore(javax.servlet.Filter filter,
                                    java.lang.Class<? extends javax.servlet.Filter> beforeFilter)

Description copied from interface: HttpSecurityBuilder

Allows adding a Filter before one of the known Filter classes. The known Filter instances are either a Filter listed in HttpSecurityBuilder.addFilter(Filter) or a Filter that has already been added using HttpSecurityBuilder.addFilterAfter(Filter, Class) or HttpSecurityBuilder.addFilterBefore(Filter, Class).

Specified by:
addFilterBefore in interface HttpSecurityBuilder<HttpSecurity>
Parameters:
filter - the Filter to register before the type beforeFilter
beforeFilter - the Class of the known Filter.
Returns:
the HttpSecurity for further customizations

tips:

如果携带了token,则进行token验证,也就是要通过自定义的过滤器;如果没有携带token,则不进行token验证,直接用UsernamePasswordAuthenticationFilter类,通过用户名密码的形式进行验证。

自定义过滤器设计思路:

所以自定义过滤器的逻辑应该是判断token是否存在,如果存在则进行token验证,如果不存在则不需要过滤。

原文地址:https://www.cnblogs.com/BonnieWss/p/11149699.html

时间: 2024-11-13 09:50:34

jwt和spring security集成的相关文章

使用JWT和Spring Security保护REST API,重拾后端之Spring Boot

通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被机器***就喝一壶的.那么一般来说,对API要划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户开放对应的API.目前,比较主流的方案有几种: 用户名和密码鉴权,使用Session保存用户鉴权结果.使用OAuth进行鉴权(其实OAuth也是一种基于Token的鉴权,只是没有规定Token的生成方式)自行采用Token进行鉴权第一种就不介绍了,由于依赖Session来维护状态,也不太适合移动时代,新的项目就不要采用了.第二

单点登录CAS与Spring Security集成(数据库验证,向客户端发送更多信息)

准备工作 CAS server从网上直接下载下来,里面有一个cas-server-webapp的工程,使用Maven命令构建,导入到Eclipse中,便可以直接使用,cas server我使用的是3.5.2版本.客户端,我是使用以前的工程,只要是Web工程就行,cas-client使用的3.2.1,Spring Security使用的是3.1.4,记得Spring Security的3.1.2版本和CAS集成时,当需要CAS Server传比较多的信息给客户端时,客户端的Spring Secur

Spring security 集成ldap服务,实现统一验证

<span style="font-size:18px;">先说一下Spring security 是基于spring的一个强大的安全验证模块,它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能.</span> LDAP是轻量目录访问协议,基

Spring security csrf实现前端纯html+ajax

spring security集成csrf进行post等请求时,为了防止csrf攻击,需要获取token才能访问 因此需要添加 <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 动态获取token 这样的话,需要使用jsp或模板引擎 但又想使用纯html+ajax.很难受 最近想到了一个办法 通过ajax获取token,后端仍使用js

漫谈Spring Security 在Spring Boot 2.x endpoints中的应用(一)

Spring Boot 2.x极大简化了默认的安全配置,并不是说有很多安全相关的配置,现在你只需要提供一个WebSecurityConfigurerAdapter继承类这样一个简单的操作,Spring Boot就可以规避很多安全问题. Actuator 不再有各自单独的安全配置(management.security.*配置已被取消),每个endpoint的sensitive 标志也会被取消,这样使得安全配置更加明确了. 比如说:你有如下配置 endpoints: info: sensitive

Spring Security安全框架

今天来简单介绍一下Spring Security安全框架 简介 Spring Security 提供了基于javaEE的企业应有个你软件全面的安全服务.这里特别强调支持使用SPring框架构件的项目,Spring框架是企业软件开发javaEE方案的领导者.如果你还没有使用Spring来开发企业应用程序,我们热忱的鼓励你仔细的看一看.熟悉Spring特别是一来注入原理两帮助你更快更方便的使用Spring Security. 人们使用Spring Secruity的原因有很多,单大部分都发现了jav

Angular集成Spring Boot,Spring Security,JWT和CORS

本文介绍了Spring Boot的基本配置,Angular集成Spring Boot.Spring Security的方法.当前流行的JWT更适合与Angular集成,优于Spring Secuity提供的CSRF.另外引入了springfox-swagger和spring-boot-starter-actuator,演示了如何利用Swagger生成JSON API文档,如何利用Actuator监控应用. 本文前端基于Angular官方样例Tour of Heroes,请先到官网下载. 技术堆栈

Spring Security 整合JWT(四)

一.前言 本篇文章将讲述Spring Security 简单整合JWT 处理认证授权 基本环境 spring-boot 2.1.8 mybatis-plus 2.2.0 mysql 数据库 maven项目 Spring Security入门学习可参考之前文章: SpringBoot集成Spring Security入门体验(一)https://blog.csdn.net/qq_38225558/article/details/101754743 Spring Security 自定义登录认证(二

spring security oauth2 jwt 认证和资源分离的配置文件(java类配置版)

最近再学习spring security oauth2.下载了官方的例子sparklr2和tonr2进行学习.但是例子里包含的东西太多,不知道最简单最主要的配置有哪些.所以决定自己尝试搭建简单版本的例子.学习的过程中搭建了认证和资源在一个工程的例子,将token存储在数据库的例子等等 .最后做了这个认证和资源分离的jwt tokens版本.网上找了一些可用的代码然后做了一个整理, 同时测试了哪些代码是必须的.可能仍有一些不必要的代码在,欢迎大家赐教. 一.创建三个spring boot 工程,分