在编写 web 应用时。我们经常会对页面进行一系列的安全控制。比如一些页面对没有权限的用户不开放访问权限,此时会令该请求的用户跳转到登录页面。当然要实现访问控制的方法方式多种多样,可以通过过滤器,拦截器,Aop,甚至集成框架来实现。(如:Apache Shiro、Spring Security)
Cfiguration
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
registry.addViewController("/").setViewName("index");
registry.addViewController("/hello").setViewName("hello");
registry.addViewController("/login").setViewName("login");
}
}
index
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example</title>
</head>
<body>
<h1>Welcome!</h1>
<p>Click <a th:href="@{/hello}">here</a> to see a greeting.</p>
</body>
</html>
home
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="注销"/>
</form>
</body>
</html>
login
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
Invalid username and password.
</div>
<div th:if="${param.logout}">
You have been logged out.
</div>
<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input ty
</body>
</html>pe="submit" value="Sign In"/></div>
</form>
Configuration
@Configuration
@EnableWebSecurity // 开启Spring Security的功能
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("passowrd").roles("USER");
}
}
- 本
WebSecurityConfig
类与注释@EnableWebSecurity
,使Spring Security的网络安全支持,并提供了Spring MVC的整合。它还扩展WebSecurityConfigurerAdapter
和覆盖了一些方法来设置Web安全配置的一些细节。 - 该
configure(HttpSecurity)
方法定义哪些URL路径应该被保护,哪些不应该。具体来说,“/”和“/ home”路径被配置为不需要任何身份验证。所有其他路径必须经过身份验证。 - 当用户成功登录时,它们将被重定向到先前请求的需要身份验证的页面。有一个自定义的“/登录”页面指定
loginPage()
,并且每个人都被允许查看它。 - 对于该
configureGlobal(AuthenticationManagerBuilder)
方法,它设置了具有单个用户的内存中用户存储。该用户的用户名为“user”,密码为“password”,角色为“USER”。
可以看到,这个 Thymeleaf 模板只是提供一个表单来捕获一个用户名和密码,并将它们发布到“/ login”。根据配置,Spring Security 提供了一个拦截该请求并验证用户的过滤器。如果用户无法验证,该页面将重定向到“/ login?error”,页面显示相应的错误消息。成功注销后,应用程序将发送到“/ login?logout”,页面显示相应的成功消息。
到这里,我们启用应用,并访问http://localhost:8080/
,可以正常访问。但是访问http://localhost:8080/hello
的时候被重定向到了http://localhost:8080/login
页面,因为没有登录,用户没有访问权限,通过输入用户名user和密码password进行登录后,跳转到了Hello World页面,再也通过访问http://localhost:8080/login?logout
,就可以完成注销操作。
网友评论