下面的代码需要spring环境的支持;

看这个系列博客之前,需要这个博客,大概了解下 spring secutity 文档


配置springSecurityFilterChain过滤器

  • 第一步

    写一个类,继承 WebSecurityConfigurerAdapter 类,并且实现 WebMvcConfigurer 接口;

    package cn.hyc.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.provisioning.InMemoryUserDetailsManager;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /**
    * 跟 springSecurityFilterChain 有关的 过滤器
    */
    @EnableWebSecurity
    public class WebSecurityConfig implements WebMvcConfigurer { /**
    * 配置认证用户信息,有好多种方法,这里只是最简单一种,写死在代码里面
    * @return
    */
    @Bean
    public UserDetailsService userDetailsService() {
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
    return manager;
    } }
  • 第二步

    然后再写一个类 ,继承 AbstractSecurityWebApplicationInitializer

    package cn.hyc.config;
    
    import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
    
    /**
    *
    *
    * 配置 springSecurityFilterChain 拦截器,拦截所有的请求
    */
    public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer { }

    以上两步,就完成了 springSecurityFilterChain 拦截器的注册,这个拦截器的名字,如果用配置文件配置,名字是不可以变的,这里用官网的教程,直接写上面的两个类,就可以完成 springSecurityFilterChain的注册;


配置身份验证

在之前的第一步的 WebSecurityConfig 类里面,我们配置了一个用户身份信息,现在,我们需要告诉 Spring Security 都对哪些 URL 进行校验;

我们让我们写的 WebSecurityConfig 类,再继承 WebSecurityConfigurerAdapter类,覆写 configure(HttpSecurity http) 方法,在里面进行配置 URL

package cn.hyc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /**
* 跟 springSecurityFilterChain 有关的 过滤器
*/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer { /**
* 认证用户信息
* @return
*/
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
return manager;
} /**
* 对 哪些 URL 进行身份验证
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout()
.logoutUrl("/logout")
.and()
.httpBasic();
} }

加载配置

我们的 WebSecurityConfig 类,就是一个配置类,我们需要将它加载到容器里面,使用下面的类,去完成加载;

package cn.hyc.config;

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; /**
* 确保 WebSecurityConfig.class 得到加载
*/
public class MvcWebApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer { @Override
protected Class<?>[] getRootConfigClasses() {
// 这里,写上配置类的名字
return new Class[] { WebSecurityConfig.class };
} @Nullable
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[0];
} @Override
protected String[] getServletMappings() {
return new String[0];
} // ... other overrides ...
}

登陆项目

这时候启动项目,可以看到下面的界面,并且我们访问任何 URL ,都会被拦截,然后重定向到这里,因为我们没有通过身份验证:

因为我们自己没有写页面,也没做任何控制层的处理,直接访问,spring Security 会自动的生成一个登陆页面,并且会帮我们进行用户名、密码的校验;

身份验证成功以后,spring security会调到我们自己没验证的时候,想要访问的页面;

这里我们是基于内存用户登陆的,因为前面的配置类里面,配置的就是在内存中用户,暂时不涉及到 JDBC 操作 ;


退出

spring security中,默认访问 /logout 即代表你要退出:

,然后默认的重定向到 /login?logout

当然上面这些,我们也可以在在配置里面,进行自定义,怎么配置,在 大概了解下 spring secutity 文档 里面都有讲,不再累述;

(一)Spring Security Demo 登陆与退出的更多相关文章

  1. Spring Security(10)——退出登录logout

    要实现退出登录的功能我们需要在http元素下定义logout元素,这样Spring Security将自动为我们添加用于处理退出登录的过滤器LogoutFilter到FilterChain.当我们指定 ...

  2. Spring Security 无法登陆,报错:There is no PasswordEncoder mapped for the id “null”

    编写好继承了WebSecurityConfigurerAdapter类的WebSecurityConfig类后,我们需要在configure(AuthenticationManagerBuilder ...

  3. Spring Security 指定登陆入口

    spring security除通过form-login的熟悉指定登陆还可以通过entry-point-ref 指定登陆入口.具体配置如下: <?xml version="1.0&qu ...

  4. bug日志-天坑,Spring Security的登陆报错:An internal error occurred while trying to authenticate the user.

    在学习Spring Security的时候,我的编辑器给我报错:An internal error occurred while trying to authenticate the user. 明明 ...

  5. Spring Security 自定义 登陆 权限验证

    转载于:https://www.jianshu.com/p/6b8fb59b614b 项目简介 基于Spring Cloud 的项目,Spring Cloud是在Spring Boot上搭建的所以按照 ...

  6. spring security demo

    直接上代码. 这个类似于配置一个shiro.xml redis.xml boot 里面xml用注解取代. 启动类 验证启用: 退出: end. spring 官网 start.spring.io

  7. spring security入门demo

    一.前言 因项目需要引入spring security权限框架,而之前也没接触过这个一门,于是就花了点时间弄了个小demo出来,说实话,刚开始接触这个确实有点懵,看网上资料写的权限大都是静态,即就是在 ...

  8. 用Spring Security, JWT, Vue实现一个前后端分离无状态认证Demo

    简介 完整代码 https://github.com/PuZhiweizuishuai/SpringSecurity-JWT-Vue-Deom 运行展示 后端 主要展示 Spring Security ...

  9. Spring Security 实战干货:实现自定义退出登录

    文章目录 1. 前言 2. 我们使用 Spring Security 登录后都做了什么 2. 退出登录需要我们做什么 3. Spring Security 中的退出登录 3.1 LogoutFilte ...

随机推荐

  1. 搭建K8S集群

    一.前言 我们将现有的虚拟机称之为Node1,用作主节点.为了减少工作量,在Node1安装Kubernetes后,我们利用VirtualBox的虚拟机复制功能,复制出两个完全一样的虚拟机作为工作节点. ...

  2. Node.js之文件下载

    Node.js之文件下载,主要最近解决我的一个需求. 需求描述:如何将腾讯云上传的文件存储到本地某个目录下,如果用js来实现,纯JavaScript没有这样的功能(也许有),正好我这个项目用node. ...

  3. [V5] ARM: dts: Change i2s compatible string on exynos5250【转】

    本文转载自:https://patchwork.kernel.org/patch/2845464/ Padmavathi VennaAug. 16, 2013, 4:26 a.m. UTC This ...

  4. 如何提高工具开发和数据分析的效率?| jupyter | Rstudio server

    这部分是超级干货,也能直接体现一个开发分析者的能力. 主要分为两部分: 1. 面对新问题时,如何高效的分析和开发? 2. 面对相似的问题时,如何最快时间的利用之前的开发经验? 因为现在我主要用shel ...

  5. EnvironmentError: mysql_config not found

    Collecting MySQL-python==1.2.5 (from -r requirementsNoGit.txt (line 9)) Using cached https://files.p ...

  6. MiniDao & Freemarker & include

    minidao include - 国内版 Binghttps://cn.bing.com/search?q=minidao+include&qs=n&form=QBRE&sp ...

  7. Linux 操作系统 & High Tech

    分享10大白帽黑客专用的 Linux 操作系统 - 51CTO.COMhttp://os.51cto.com/art/201905/597156.htm Ubuntu 创始人谈论为什么 Linux 在 ...

  8. realsense SDK编译 debug

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

  9. 全面系统Python3入门+进阶_汇总

    https://coding.imooc.com/class/136.html#Anchor 全面系统Python3入门+进阶-1-1 导学 全面系统Python3入门+进阶-1-2 Python的特 ...

  10. springboot 项目基本目录包结构

    1.基本目录结构 controller service impl mapper utils domain config interceoter(拦截器) dto