SpringSecurity的formLogin登录认证模式实例讲解
创始人
2024-12-24 03:41:57
0次

一、formLogin的应用场景

在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模式比较简单,只是进行了通过携带Http的Header进行简单的登录验证,而且没有定制的登录页面,所以使用场景比较窄。

对于一个完整的应用系统,与登录验证相关的页面都是高度定制化的,非常美观而且提供多种登录方式。这就需要Spring Security支持我们自己定制登录页面,也就是本文给大家介绍的formLogin模式登录认证模式。

准备工作

新建一个Spring Boot 的web应用,引入Spring Security Starter。  准备一个login.html登录页面,页面内容非常简单,一个from表单、用户名和密码输入框,一个提交按钮  准备一个首页index.html,在登录成功之后需要进入index.html首页  首页可以看到syslog(日志管理)、sysuer(用户管理)、biz1(业务一)、biz2(业务二)四个页面超文本链接选项。通过controller控制层跳转页面,并在对应页面写一些标志性文字即可,不需写具体业务。

需求

我们希望biz1(业务一)、biz2(业务二)普通的操作用户user就可以访问  我们希望管理员可以访问包括syslog(日志管理)和sysuser(用户管理)在内的所有资源

以上就是本文介绍formLogin模式需要进行的准备工作及需求,下面我们就来实现其中的核心的登录验证逻辑,准备工作非常简单请自行实现。(新建spring boot应用,登录页面、首页、四个业务页面都写成非常简单的html即可,不用写实际业务和样式。)

二、说明

formLogin模式的三要素:

登录验证逻辑  资源访问控制规则,如:资源权限、角色权限  用户信息

一般来说,使用权限认证框架的的业务系统登录验证逻辑是固定的,而资源访问控制规则和用户信息是从数据库或其他存储介质灵活加载的。但本文所有的用户、资源、权限信息都是代码配置写死的,旨在为大家介绍formLogin认证模式,如何从数据库加载权限认证相关信息我还会结合RBAC权限模型再写文章的。

三、实现formLogin模式基础配置

首先,我们要继承WebSecurityConfigurerAdapter ,重写configure(HttpSecurity http) 方法,该方法用来配置登录验证逻辑。请注意看下文代码中的注释信息。

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {  @Override  protected void configure(HttpSecurity http) throws Exception {    http.csrf().disable() //禁用跨站csrf攻击防御,后面的章节会专门讲解      .formLogin()        .loginPage("/login.html")//用户未登录时,访问任何资源都转跳到该路径,即登录页面        .loginProcessingUrl("/login")//登录表单form中action的地址,也就是处理认证请求的路径        .usernameParameter("uname")///登录表单form中用户名输入框input的name名,不修改的话默认是username        .passwordParameter("pword")//form中密码输入框input的name名,不修改的话默认是password        .defaultSuccessUrl("/index")//登录认证成功后默认转跳的路径        .and()      .authorizeRequests()        .antMatchers("/login.html","/login").permitAll()//不需要通过登录验证就可以被访问的资源路径        .antMatchers("/biz1").hasAnyAuthority("biz1") //前面是资源的访问路径、后面是资源的名称或者叫资源ID        .antMatchers("/biz2").hasAnyAuthority("biz2")        .antMatchers("/syslog").hasAnyAuthority("syslog")        .antMatchers("/sysuser").hasAnyAuthority("sysuser")        .anyRequest().authenticated();  }}

上面的代码分为两部分:

第一部分是formLogin配置段,用于配置登录验证逻辑相关的信息。如:登录页面、登录成功页面、登录请求处理路径等。

第二部分是authorizeRequests配置端,用于配置资源的访问权限。如:开发登录页面的permitAll开放访问,“/biz1”(业务一页面资源)需要有资源ID为"biz1"的用户才可以访问。

这时候,我们通过浏览器访问,随便测试一个没有访问权限的资源,都会跳转到login.html页面。

四、实现资源访问限制的需求

在上文中,我们配置了登录验证及资源访问的权限规则,我们还没有具体的用户,下面我们就来配置具体的用户。重写WebSecurityConfigurerAdapter的 configure(AuthenticationManagerBuilder auth)方法

public void configure(AuthenticationManagerBuilder auth) throws Exception {  auth.inMemoryAuthentication()    .withUser("user").password(passwordEncoder().encode("123456")).authorities("biz1","biz2")    .and()    .passwordEncoder(passwordEncoder());//配置BCrypt加密}@Beanpublic PasswordEncoder passwordEncoder(){  return new BCryptPasswordEncoder();}inMemoryAuthentication指的是在内存里面存储用户的身份认证和授权信息。withUser("user")用户名是userpassword(passwordEncoder().encode("123456"))密码是加密之后的123456authorities("biz1","biz2")指的是user用户拥有资源ID为biz1(业务一)和biz2(业务二)资源的权限

这样,我们就实现了文首提出的普通用户只能访问biz1(业务一)和biz2(业务二)资源的需求。那么管理员用户可以访问所有的资源的配置方式,你会不会呢?同样的配方、同样的方式、自己可以尝试一下哦!

五、静态资源访问

在我们的实际开发中,登录页面login.html和控制层Controller登录验证'/login'都必须无条件的开放。除此之外,一些静态资源如css、js文件通常也都不需要验证权限,我们需要将它们的访问权限也开放出来。下面就是实现的方法:重写WebSecurityConfigurerAdapter类的configure(WebSecurity web) 方法

@Override  public void configure(WebSecurity web) {    //将项目中静态资源路径开放出来    web.ignoring().antMatchers("/config/**", "/css/**", "/fonts/**", "/img/**", "/js/**");  }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...