我在我的应用程序中使用Spring Security,这是安全部分,用于验证用户,但登录页面由Spring Security提供:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
.antMatchers("/home*").hasRole("USER")
.and()
.formLogin();
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user")
.password("password")
.roles("USER")
}
}
而不是Spring的登录页面,我想使用下面的登录页面:
login.html
:
<html lang='en'>
<head>
<title>WebApp</title>
<meta charset='utf-8' />
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/bootstrap.css" />
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
<link rel="stylesheet" href="css/login.css" />
</head>
<body>
<div class="login-page">
<img src='img/taxi_.jpg' style='width: 180px; margin-left: auto; margin-right: auto; display: block; padding-top: 20px; padding-bottom:20px;' />
<div class="heading">
<center>Dashboard</center>
</div>
<div class="form">
<form action ="home.html" class="register-form">
<input type="text" placeholder="name"/>
<input type="password" placeholder="password"/>
<input type="text" placeholder="email address"/>
<button>create</button>
<p class="message">Already registered? <a href="#">Sign In</a></p>
</form>
<form action="home.html" class="login-form">
<input type="text" placeholder="username"/>
<input type="password" placeholder="password"/>
<button id="button_login">login</button>
<p class="message">Not registered? <a href="#">Create an account</a></p>
</form>
</div>
</div>
</body>
</html>
如何使用自定义登录页面而不是Spring Security的登录页面?
答案 0 :(得分:1)
虽然自动生成的登录页面便于快速启动和运行,但大多数应用程序都希望提供自己的登录页面。为此,我们可以更新我们的配置,如下所示:
protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") 1 .permitAll(); 2 }
1 更新的配置指定了登录页面的位置 2 我们必须授予所有用户(即未经身份验证的用户)访问我们的登录页面的权限。 formLogin()。permitAll()方法允许为与基于表单的登录相关联的所有URL授予对所有用户的访问权限。
您修改过的代码:
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
.antMatchers("/home*").hasRole("USER")
.and()
.formLogin()
.loginPage("/login.html")
.permitAll();
}
答案 1 :(得分:0)
httpSecurity.authorizeRequests()
.antMatchers("/home*").hasRole("USER").and()
.formLogin()
.loginPage("/login.html")
.permitAll();
loginFormUrl
必须以&#34; /&#34;开头或绝对的网址。并确保可以正确处理请求/login.html
。
顺便说一句:如果您没有配置处理网址,则处理网址与login page
(/login.html
)网址的方式相同post
方法,但在您的登录页面中,操作网址为/home.html
,请将处理网址配置为&#39; /home.html'
.formLogin()
.loginProcessingUrl("/home.html")
.loginPage("/login.html")
.permitAll();
默认情况下启用CSRF
,我无法在您的登录表单中找到任何CSRF
令牌。您可以禁用csrf或使用令牌请求。
http.csrf().disable();
答案 2 :(得分:0)
只想指出此处未阐明的片刻。
1)首先,.loginPage("/login.html")
不会解决问题(无论如何我都没有)。引号中的内容是将在控制器中搜索的URL路径。这是我的安全配置文件中的代码片段:
.formLogin().loginPage("/login")
.loginProcessingUrl("/authentication").permitAll();
在这里我写了"/login"
。因此,现在在您的控制器中定义/login
路径应指向您的login.html
页面。
@GetMapping("/login")
public String login() {
return "login";
}
只有这样,它才应重定向到所需的视图页面。我通常将查看页面放在/webapp/WEB-INF/view
文件夹下。
附言我希望您正确配置ViewResolver
bean,否则cos否则将不起作用:)
2)还有一件事。我看到您想在页面上使用一些CSS。要为自定义登录页面启用CSS和其他静态资源,您应该添加此行
.antMatchers("/resources/**").permitAll()
因此,最终将是这样(非常简短和令人毛骨悚然的版本,但是您的自定义登录应该可以):
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login")
.loginProcessingUrl("/authentication").permitAll();
}
仅供参考,请将您的资源放在/webapp/resources/
下。另外,您应该在spring配置文件中配置资源处理程序。
我的解释很la脚,但希望有人能理解。希望它能工作:)
这里也是一个不错的链接,可以将您的头缠住: