一、formLogin的应用场景
在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模式比较简单,只是进行了通过携带Http的Header进行简单的登录验证,而且没有定制的登录页面,所以使用场景比较窄。
对于一个完整的应用系统,与登录验证相关的页面都是高度定制化的,非常美观而且提供多种登录方式。这就需要Spring Security支持我们自己定制登录页面,也就是本文给大家介绍的formLogin模式登录认证模式。
准备工作
需求
以上就是本文介绍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登录认证模式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本文向大家介绍django rest framework 实现用户登录认证详解,包括了django rest framework 实现用户登录认证详解的使用技巧和注意事项,需要的朋友参考一下 1、安装 2、创建项目及应用 创建项目 创建应用 目录结构如图 3、设置settings.py 设置数据库连接 添加应用 4、创建用户信息models,在models.py 在项目下执行命令生成数据表 5、在
本文向大家介绍Springboot+SpringSecurity+JWT实现用户登录和权限认证示例,包括了Springboot+SpringSecurity+JWT实现用户登录和权限认证示例的使用技巧和注意事项,需要的朋友参考一下 如今,互联网项目对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,目前比较成熟的几种大家比较熟悉的模式,像RBAC 基于角色权限的验证,shiro框架专门用于
作者:陈希章 发表于 2018年3月22日
本文向大家介绍SpringSecurity 默认表单登录页展示流程源码,包括了SpringSecurity 默认表单登录页展示流程源码的使用技巧和注意事项,需要的朋友参考一下 SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程, 涉及 1.FilterSecurityInterceptor, 2.Excep
本文向大家介绍浅谈django中的认证与登录,包括了浅谈django中的认证与登录的使用技巧和注意事项,需要的朋友参考一下 认证登录 django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1 authenticate(**credentials) 提供了用户认证,即验证用户名以及密码是否正确 一般需要username password两个关键字参数 如果认证信
springsecurity oauth2.0 谁做过记录登录日志?监听事件好像没法区分是什么原因失败的、比如client错误还是用户名错误