通过登录和注销保护你的 WebApp
这个例子是一个非常简单的 Spring Boot 应用程序。
Maven 依赖
首先将以下依赖项添加到项目中。创建新项目时,建议使用 Spring Initializr 。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
</dependencies>
创建 WebApp
使用网站和控制器创建 Web 应用程序。例如,这个非常小的 webapp 只有一个页面(index.html)和登录页面的条目。
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/", "index");
registry.addViewController("/index").setViewName("index");
registry.addViewController("/login").setViewName("login");
}
}
保护你的 WebApp
配置 Spring Security 以保护你的 webapp。例如。仅允许经过身份验证的用户提出任何请求允许使用 js 和 css 等静态资源,否则不会为未经过身份验证的用户加载它们。从此规则中排除登录和注销页面并创建测试用户:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/css/*.css", "/js/*.js").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
创建登录页面
登录页面需要有一个表单,使发布请求为“/ login”:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login</title>
<link th:href="@{/css/stylesheet.css}" rel="stylesheet" type="text/css"/>
<script type="text/javascript" th:src="@{/js/login.js}"></script>
</head>
<body>
<!-- show notification on error -->
<div th:if="${param.error}">
Invalid username or password.
</div>
<!-- show notification of logout -->
<div th:if="${param.logout}">
You have been logged out.
</div>
<!-- login form -->
<div>
<form th:action="@{/login}" method="post">
<h2 >Please sign in</h2>
<label >User Name</label>
<input type="text" name="username" th:required="required" th:autofocus="autofocus"/>
<br/>
<label>Password</label>
<input type="password" name="password" th:required="required" />
<br/>
<input type="submit" value="Sign In"/>
</form>
</div>
</body>
</html>
当用户输入错误的用户名/密码时,将设置 error 参数。当用户注销时,设置了注销参数。这用于显示相应的消息。
访问用户属性
成功登录后,用户将被定向到 index.html 。在 Spring Security 的方言允许我们访问像他的用户名的用户属性:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Index</title>
</head>
<body>
<div>
<h3>Welcome <span th:text="${#authentication.name}"/></h3>
<form th:action="@{/logout}" method="post">
<input type="submit" value="Logout"/>
</form>
</div>
</body>
</html>
通过邮寄请求到“/ logout”实现注销