java中的接口是类吗
310
2023-01-04
Spring Security 表单登录功能的实现方法
1.简介
本文将重点介绍使用 Spring Security 登录。 本文将构建在之前简单的 Spring MVC示例 之上,因为这是设置Web应用程序和登录机制的必不可少的。
2. Maven 依赖
要将Maven依赖项添加到项目中,请参阅Spring Security with Maven 一文。 标准的 spring-security-web 和 spring-security-config 都是必需的。
3. Spring Security java配置
我们首先创建一个扩展 WebSecurityConfigurerAdapter 的 Spring Security 配置类。 通过添加 @EnableWebSecurity ,我们获得了Spring Security和MVC集成支持:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
.and()
.withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/anonymoushttp://*").anonymous()
.antMatchers("/login*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html", true)
//.failureUrl("/login.html?error=true")
.failureHandler(authenticationFailureHandler())
.and()
.logout()
.logoutUrl("/perform_logout")
.deleteCookies("jsESSIONID")
.logoutSuccessHandler(logoutSuccessHandler());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在此示例中,我们使用内存身份验证并定义了3个用户。
现在来看看我们用来创建表单登录配置的元素。
3.1. authorizeRequests()
我们允许匿名访问*/login*,以便用户可以进行身份验证,同时也是保护其他请求。请注意,*antMatchers()*元素的顺序很重要 - 首先需要填写具体的路径规则,然后是才是大致匹配的规则。
3.2. formLogin()
这有几种方法可以用来配置表单登录的行为:
loginPage() – 自定义登录页面
loginProcessingUrl() – 提交username和password的URL
defaultSuccessUrl() – 登录成功后跳转的URL
failureUrl() – 登录失败后跳转的URL
3.3. Authentication Manager
身份验证提供程序由一个简单的内存实现支持 - InMemoryUserDetailsManager 。 当尚不需要完整的持久性机制时,这对于进行快速原型设计很有用。
从Spring 5开始,我们还必须定义密码编码器。 在我们的例子中,我们使用了 BCryptPasswordEncoder 。
4. 添加Spring Security到Web应用
要使用上面定义的Spring Security配置,我们需要将其添加到Web应用程序。 在这种情况下,我们不需要任何 web.xml :
public class SpringApplicationInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class>[] getRootConfigClasses() {
return new Class[] {SecSecurityConfig.class};
}
}
注意,如果我们使用Spring Boot应用程序,则不需要此初始化程序。 有关如何在Spring Boot中加载安全性配置的更多详细信息,详情参阅 Spring Boot security auto-configuration
5. Spring Security XML配置
我们来看看相应的XML配置。整个项目使用Java配置,因此我们需要通过Java @Configuration 类导入XML配置文件:
@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
public SecSecurityConfig() {
super();
}
}
以及Spring Security 的XML配置– webSecurityConfig.xml :
default-target-url="/homepage.html" authentication-failure-url="/login.html?error=true" /> class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> 6. web.xml 在引入Spring 4之前,我们曾经在 web.xml 中配置Spring Security - 只有一个额外的过滤器添加到 Spring MVC 的web.xml中: 过滤器 - DelegatingFilterProxy - 简单地委托给一个Spring管理的bean - FilterChainProxy-它本身可以从完整的Spring bean生命周期管理中受益。 7. Login Form 登录表单页面使用简单的机制将视图名称映射到URL 向Spring MVC注册,且无需编写Controller: registry.addViewController("/login.html"); 对应于 login.jsp :
default-target-url="/homepage.html"
authentication-failure-url="/login.html?error=true" />
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
6. web.xml
在引入Spring 4之前,我们曾经在 web.xml 中配置Spring Security - 只有一个额外的过滤器添加到 Spring MVC 的web.xml中:
过滤器 - DelegatingFilterProxy - 简单地委托给一个Spring管理的bean - FilterChainProxy-它本身可以从完整的Spring bean生命周期管理中受益。
7. Login Form
登录表单页面使用简单的机制将视图名称映射到URL 向Spring MVC注册,且无需编写Controller:
registry.addViewController("/login.html");
对应于 login.jsp :
Spring Login form包含以下相关组件:
login - 接受表单POST的URL,触发身份验证过程
username - 用户名
password - 密码
8.进一步配置Spring登录
当我们在上面介绍Spring安全配置时,我们简要讨论了一些登录机制的配置 - 现在详细介绍一下。
覆盖Spring Security中大多数默认值的一个原因是隐藏应用程序受Spring Security保护的事实,并最大限度地减少潜在攻击者对应用程序的了解。
完全配置后,login元素如下所示:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html",true)
.failureUrl("/login.html?error=true")
}
或者相应的XML配置:
login-page='/login.html' login-processing-url="/perform_login" default-target-url="/homepage.html" authentication-failure-url="/login.html?error=true" always-use-default-target="true"/> 8.1. 登录页 接下来,让我们看看如何使用*loginPage()*方法配置自定义登录页面: http.formLogin() .loginPage("/login.html") 或者,使用XML配置: login-page='/login.html' 如果我们不指定这个,Spring Security将在*/login*上生成一个非常基本的登录表单。 8.2. 登录的POST URL 触发身份验证默认的URL是*/login*,我们可以使用 loginProcessingUrl 方法来覆盖此URL: http.formLogin() .loginProcessingUrl("/perform_login") 或者,使用XML配置: login-processing-url="/perform_login" 覆盖此默认URL的一个很好的理由是:隐藏应用程序受 Spring Security 保护的事实 - 该信息不应在外部提供。 8.3. 登录成功页面 成功登录过程后,用户将被重定向到页面 - 默认情况下,该页面是Web应用程序的根目录。 我们可以通过*defaultSuccessUrl()*方法覆盖它: http.formLogin() fYcQUEN.defaultSuccessUrl("/homepage.html") 或者,使用XML配置: default-target-url="/homepage.html" 如果 always-use-default-target 设置为 true ,则用户始终会重定向到此页面。 如果该属性设置为 false ,则在提示进行身份验证之前,用户将被重定向到他们想要访问的上一页。 8.4. 登录失败页面 与登录页面相同,默认情况下, Spring Security 会在*/login?error*自动生成登录失败页面。 要覆盖它,我们可以使用*failureUrl()*方法: http.formLogin() .failureUrl("/login.html?error=true") 或者XML: authentication-failure-url="/login.html?error=true" 9. 结论 在这个Spring登录示例中,我们配置了一个简单的身份验证过程 - 我们讨论了Spring安全登录表单,安全配置和一些可用的更高级的自定义。 这个Spring登录教程的实现可以在github 项目中找到 - 这是一个基于Eclipse的项目,所以它应该很容易导入和运行。 当项目在本地运行时,可以在以下位置访问示例HTML: http://localhost:8080/spring-security-mvc-login/login.html 总结
login-page='/login.html'
login-processing-url="/perform_login"
default-target-url="/homepage.html"
authentication-failure-url="/login.html?error=true"
always-use-default-target="true"/>
8.1. 登录页
接下来,让我们看看如何使用*loginPage()*方法配置自定义登录页面:
http.formLogin()
.loginPage("/login.html")
或者,使用XML配置:
login-page='/login.html'
如果我们不指定这个,Spring Security将在*/login*上生成一个非常基本的登录表单。
8.2. 登录的POST URL
触发身份验证默认的URL是*/login*,我们可以使用 loginProcessingUrl 方法来覆盖此URL:
http.formLogin()
.loginProcessingUrl("/perform_login")
或者,使用XML配置:
login-processing-url="/perform_login"
覆盖此默认URL的一个很好的理由是:隐藏应用程序受 Spring Security 保护的事实 - 该信息不应在外部提供。
8.3. 登录成功页面
成功登录过程后,用户将被重定向到页面 - 默认情况下,该页面是Web应用程序的根目录。
我们可以通过*defaultSuccessUrl()*方法覆盖它:
http.formLogin()
fYcQUEN.defaultSuccessUrl("/homepage.html")
或者,使用XML配置:
default-target-url="/homepage.html"
如果 always-use-default-target 设置为 true ,则用户始终会重定向到此页面。 如果该属性设置为 false ,则在提示进行身份验证之前,用户将被重定向到他们想要访问的上一页。
8.4. 登录失败页面
与登录页面相同,默认情况下, Spring Security 会在*/login?error*自动生成登录失败页面。
要覆盖它,我们可以使用*failureUrl()*方法:
http.formLogin()
.failureUrl("/login.html?error=true")
或者XML:
authentication-failure-url="/login.html?error=true"
9. 结论
在这个Spring登录示例中,我们配置了一个简单的身份验证过程 - 我们讨论了Spring安全登录表单,安全配置和一些可用的更高级的自定义。
这个Spring登录教程的实现可以在github 项目中找到 - 这是一个基于Eclipse的项目,所以它应该很容易导入和运行。
当项目在本地运行时,可以在以下位置访问示例HTML:
http://localhost:8080/spring-security-mvc-login/login.html
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~