原文:http://www.toocruel.net/spring-security/
从配置到安全性,Web应用到大数据 - 无论您的应用程序的基础架构需求如何,都有一个Spring Project来帮助您构建它。
从小处着手,根据需要使用 - Spring是通过设计模块化的。
https://spring.io/projects
Spring Security是一个强大且高度可定制的身份验证和访问控制框架。
这是保护基于Spring的应用程序的事实标准。
Spring Security是一个专注于为Java应用程序提供身份验证和授权的框架。
与所有Spring项目一样,Spring Security的真正实力在于如何轻松扩展以满足自定义需求
全面和可扩展的支持认证和授权
防止会话固定,点击劫持,跨站点请求伪造等攻击
Servlet API集成
与Spring Web MVC的可选集成
多得多…
现在有一个spring boot web项目,只有一个非常简单控制器:
@Controller
public class MainController {
@RequestMapping("/")
public String root() {
return "redirect:/index";
}
@RequestMapping("/index")
public String index() {
return "index";
}
@RequestMapping("/user/index")
public String userIndex() {
return "user/index";
}
}
有三个主要请求路径
/ 访问根路径跳转
/index 网站首页
/user/index 用户的首页
接下来接入Spring Security,这里定义一下用户及角色:
用户名为“user”的用户拥有角色“USER”,有角色“USER”的用户才有权限访问/user/index
新建类SecurityConfig
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/css/**", "/index").permitAll()//与/ css / **和/ index匹配的请求是完全可访问的
.antMatchers("/user/**").hasRole("USER")//与/ user / **匹配的请求需要用户进行身份验证,并且必须与USER角色关联
.and()
.formLogin()
.loginPage("/login").failureUrl("/login-error") .permitAll();;//使用自定义登录页面和失败url启用基于表单的身份验证
}
/**
* The name of the configureGlobal method is not important.
* However, it is important to only configure AuthenticationManagerBuilder
* in a class annotated with either @EnableWebSecurity,
* @EnableGlobalMethodSecurity, or @EnableGlobalAuthentication.
* Doing otherwise has unpredictable results.
* @param auth
* @throws Exception
*/
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER");
}
}
.loginPage("/login")
包含以下过程: .antMatchers("/css/**", "/index").permitAll()
这允许任何人访问以/ css开头的URL 。由于这是我们的CSS,类似的,我们应该让所有的静态资源/js、/images 等都可以被任何人查看。修改MainController为:
@Controller
public class MainController {
@RequestMapping("/")
public String root() {
return "redirect:/index";
}
@RequestMapping("/index")
public String index() {
return "index";
}
@RequestMapping("/user/index")
public String userIndex() {
return "user/index";
}
@RequestMapping(value = "/login")
public String login() {
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String postLogin() {
// TODO Enable form login with Spring Security (trigger error for now)
return "redirect:/login-error";
}
@RequestMapping("/login-error")
public String loginError(Model model) {
model.addAttribute("loginError", true);
return "login";
}
}
网站主页index.html
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
<title>Hello Spring Securitytitle>
<meta charset="utf-8" />
<link rel="stylesheet" href="/css/main.css" th:href="@{/css/main.css}" />
head>
<body>
<div th:fragment="logout" class="logout" sec:authorize="isAuthenticated()">
Logged in user: <span sec:authentication="name">span> |
Roles: <span sec:authentication="principal.authorities">span>
<div>
<form action="#" th:action="@{/logout}" method="post">
<input type="submit" value="Logout" />
form>
div>
div>
<h1>Hello Spring Securityh1>
<p>This is an unsecured page, but you can access the secured pages after authenticating.p>
<ul>
<li>Go to the <a href="/user/index" th:href="@{/user/index}">secured pagesa>li>
ul>
body>
html>
/logout
是Spring Security提供的,无需我们处理登录页面login.html
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login pagetitle>
<meta charset="utf-8" />
<link rel="stylesheet" href="/css/main.css" th:href="@{/css/main.css}" />
head>
<body>
<h1>Login pageh1>
<p>Example user: user / passwordp>
<p th:if="${loginError}" class="error">Wrong user or passwordp>
<form th:action="@{/login}" method="post">
<label for="username">Usernamelabel>:
<input type="text" id="username" name="username" autofocus="autofocus" /> <br />
<label for="password">Passwordlabel>:
<input type="password" id="password" name="password" /> <br />
<input type="submit" value="Log in" />
form>
<p><a href="/index" th:href="@{/index}">Back to home pagea>p>
body>
html>
/login
)相同,但使用POST而不是GET。/login-error
,因此我们可以通过检测参数错误是否为非空来显示错误消息。/login?logout
,因此我们可以通过检测参数注销是否为非空来显示注销成功消息。username
中password
中
。完整代码:https://github.com/toocruel/springProjectsStudy/tree/master/spring-security
效果
首页:
点击secured pages 进去登录页:
输入user password 进入用户主页: