详解SpringSecurity的formLogin登录认证模式
⼀、formLogin的应⽤场景
在本专栏之前的⽂章中,已经给⼤家介绍过Spring Security的HttpBasic模式,该模式⽐较简单,只是进⾏了通过携带Http的Header进⾏简单的登录验证,⽽且没有定制的登录页⾯,所以使⽤场景⽐较窄。
对于⼀个完整的应⽤系统,与登录验证相关的页⾯都是⾼度定制化的,⾮常美观⽽且提供多种登录⽅式。
这就需要Spring Security⽀持我们⾃⼰定制登录页⾯,也就是本⽂给⼤家介绍的formLogin模式登录认证模式。
准备⼯作
springboot和过滤器
新建⼀个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) ⽅法,该⽅法⽤来配置登录验证逻辑。请注意看下⽂代码中的注释信息。
@Configuration
public 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加密
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
inMemoryAuthentication指的是在内存⾥⾯存储⽤户的⾝份认证和授权信息。
withUser("user")⽤户名是user
password(passwordEncoder().encode("123456"))密码是加密之后的123456
authorities("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/**");
}
总结
以上所述是⼩编给⼤家介绍的Spring Security的formLogin登录认证模式,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。