当前位置: 首页 > 科技观察

教你自定义SpringSecurity表单登录

时间:2023-03-21 23:06:43 科技观察

本专栏上一篇介绍了HttpBasic模式。这种方式比较简单,只是通过携带Http的Header进行简单的登录验证,没有可以自定义页面的登录,所以使用场景比较窄。一个完整的应用系统,登录验证相关的页面都是高度定制化的,非常漂亮,提供多种登录方式。这就需要SpringSecurity支持我们自己自定义的登录页面,也就是本文给大家介绍的FormLogin方式的登录认证方式。1、在介绍新项目的相关内容之前,需要先搭建一个demo,新建一个项目spring-security-02,需要添加如下依赖:org.springframework.bootspring-除了boot-starter-security,还需要添加web和thymeleaf依赖,这里就不贴了。demo结构如下:2.新建一个登录页面。不要使用默认的安全页面,而是自己定制一个。代码如下:一个简单的带表单的登录页面,需要注意以下参数:action:安全登录的url,可以自定义。username:安全登录的用户名,可自定义。password:安全登录密码,可自定义。以上三个参数可以通过配置在security中定义。3.创建一个新的主页。这是登录成功后重定向的主页。代码如下:4.新建一个界面。安全中的所有接口都称为资源。下面新建两个测试接口。代码如下:5.formLogin的配置说明如何在配置之前先了解一下formLogin方式登录的五要素:登录认证逻辑-登录URL:这个URL在安全上默认是/login和POST请求,但是也可以通过配置进行定制。如何接收登录参数:用户名和密码默认接收的字段分别是用户名和密码,也可以通过配置自定义。登录成功后的逻辑:也可以自定义登录成功后的处理逻辑,比如跳转到指定页面,返回具体的JSON数据。资源访问控制规则:这个用来控制哪些用户和角色可以访问哪些资源,可以静态指定,也可以从数据库加载。用户拥有角色权限:配置用户有哪些角色和权限,可以静态指定,也可以从数据库加载。一般来说,使用权限认证框架的业务系统登录验证逻辑是固定的,而资源访问控制规则和用户信息则灵活地从数据库或其他存储介质加载。但是本文中所有的用户、资源、权限信息都是写在代码配置中的。目的是介绍formLogin认证方式以及如何从数据库中加载权限认证相关信息。我也会写一篇基于RBAC权限模型的文章。针对以上5个元素,formLogin配置代码如下:首先,我们需要继承WebSecurityConfigurerAdapter,重写configure(HttpSecurityhttp)方法,用于配置登录验证逻辑。请注意代码中的注释。上面的代码分为两部分:第一部分是formLogin配置部分,用于配置登录验证逻辑相关的信息。如:登录页面、登录成功页面、登录请求处理路径等。.loginPage("/login/page"):指定第2步自定义的登录页面,需要写一个mvc接口跳转到登录。html,请查看源代码。.loginProcessingUrl("/login"):指定处理登录逻辑的url。该接口无需开发者定义,安全通过过滤器。UsernamePasswordAuthenticationFilter处理,后面介绍。.usernameParameter("username"):指定接收用户名参数的字段。默认为用户名。具体逻辑在UsernamePasswordAuthenticationFilter中。.passwordParameter("password"):指定用于接收密码参数的字段。默认为用户名。具体逻辑在UsernamePasswordAuthenticationFilter中。.defaultSuccessUrl("/"):登录认证成功后的默认重定向路径,其中/为跳转到/index.html,可自定义。.failureUrl("/login/page"):登录失败的重定向路径。第二部分是authorizeRequests配置部分,用于配置资源的访问控制规则。antMatchers("/login/page","/login").permitAll():配置登录页面和登录界面直接允许,不拦截登录。antMatchers("/","/hello1").hasAnyAuthority("ROLE_user","ROLE_admin"):设置/hello1和/需要user和admin角色才能访问。.antMatchers("/hello2").hasAnyRole("admin"):配置/hello2该资源需要admin角色才能访问。.anyRequest().authenticated():除了上述配置规则外,访问其他资源需要登录认证才能访问。6、用户和角色配置上面规则中配置的一些资源需要特定的角色才能访问,比如user和admin,那么这些角色如何指定呢?security中提供了配置方法,代码如下:上面的代码配置很简单,创建了两个用户并指定了角色,如下:用户:密码123456,分配的角色为user。admin:密码为123456,分配的角色为user和admin。配置解释如下:.inMemoryAuthentication():指在内存中存储用户的身份认证和授权信息;这里也可以配置从数据库动态加载,后面会介绍。withUser("user"):用户名为user。password(passwordEncoder().encode("123456")):密码加密后为123456。roles():该方法用于指定用户的角色,一个用户可以有多个角色。passwordEncoder(passwordEncoder()):指定密码的加密方式,使用BCryptPasswordEncoder,后面会介绍。7、简单测试按照上面6个步骤,一个表单登录基本实现了,下面来测试一下。浏览器访问http://localhost:8081/hello2,第一次访问会因为没有登录自动跳转到登录页面,如下图:输入用户名和密码,因为资源/hello2需要admin角色才能访问,所以必须以admin用户登录,否则会报403错误,登录成功后才能正常访问。如果用户名或密码错误,会触发.failureUrl("/login/page")的配置,自动跳转到登录页面。8.在第5步的配置中,与登录结果相关的配置如下二:.defaultSuccessUrl("/"):登录认证成功后的默认重定向路径,其中/为跳转到/index.html,可以定制。.failureUrl("/login/page"):登录失败的重定向路径。这两个配置都是指定url的方式:当我们登录成功后,登录结果由AuthenticationSuccessHandler处理,默认跳转到defaultSuccessUrl配置的路径对应的资源页面(一般是首页index.html).当我们登录失败时,登录结果由AuthenticationFailureHandler处理,默认跳转到failureUrl配置的路径对应的资源页面(一般也会跳转到登录页面login.html重新登录)。然而,在Web应用开发的过程中,需求是千变万化的。有时我们需要个性化登录结果。比如我们希望不同的人登录后看到不同的首页(跳转到不同的路径)。我们的应用是前后端分离的,验证响应结果是JSON格式的数据,而不是页面跳转。...和其他未穷尽的例子。因此,您需要自定义登录结果。本文首先介绍如何自定义跳转页面。前后端分离架构下需要JSON格式的数据。8.1自定义登录成功结果AuthenticationSuccessHandler接口是Security提供的认证成功处理接口,我们只需要实现即可。但一般来说,我们不会直接实现AuthenticationSuccessHandler接口,而是继承SavedRequestAwareAuthenticationSuccessHandler类,它会记住用户上次请求的资源路径,比如路径/hello2,登录成功后会自动跳转到到/hello2页面而不是主页。代码如下:8.2自定义登录失败结果这里我们同样没有直接实现AuthenticationFailureHandler接口,而是继承了SimpleUrlAuthenticationFailureHandler类。该类默认实现了登录验证失败的跳转逻辑,即登录失败后返回登录页面。我们可以使用它来简化我们的代码。代码如下:8.3SecurityConfig中的配置配置如下:将自定义的AuthenticationSuccessHandler和AuthenticationFailureHandler注入到SpringSecurity配置类中,使用formlogin方式,配置successHandler和failureHandler。请勿配置defaultSuccessUrl和failureUrl,否则自定义处理程序将失败。Handler配置和URL配置只能二选一。小结本文介绍了SpringSecurity的formLogin的配置方法。需要注意的是,这里不支持前后端分离架构。