1.1 HttpSecurity
到目前为止,我们的WebSecurityConfig仅包含有关如何验证用户身份的信息。 Spring Security如何知道我们要求所有用户都经过身份验证? Spring Security如何知道我们想要支持基于表单的身份验证?
原因是WebSecurityConfigurerAdapter在configure(HttpSecurity http)方法中提供了一个默认配置,如下所示:
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
上面的默认配置:
- 确保对我们的应用程序的任何请求都要求用户进行身份验证
- 允许用户使用基于表单的登录进行身份验证
- 允许用户使用HTTP基本身份验证进行身份验证
您会注意到此配置与XML命名空间配置非常相似:
<http> <intercept-url pattern="/**" access="authenticated"/> <form-login /> <http-basic /> </http>使用
and()方法表示关闭XML标记的Java配置,这允许我们继续配置父标记。 如果您阅读代码,它也是有道理的。
我想配置授权请求并配置表单登录并配置HTTP基本身份验证。
1.2 Java Configuration and Form Login
当您被提示登录时,您可能想知道登录表单的来源,因为我们没有提及任何HTML文件或JSP。 由于Spring Security的默认配置未明确设置登录页面的URL,因此Spring Security会根据启用的功能自动生成一个URL,并使用处理提交的登录的URL的标准值,用户将使用的默认目标URL 登录后发送给等等。
虽然自动生成的登录页面便于快速启动和运行,但大多数应用程序都希望提供自己的登录页面。 为此,我们可以更新我们的配置,如下所示:
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
- 更新的配置指定登录页面的位置。
- 我们必须授予所有用户(即未经身份验证的用户)访问我们的登录页面的权限。 formLogin().permitAll()方法允许为与基于表单的登录相关联的所有URL授予对所有用户的访问权限。
使用JSP实现当前配置的示例登录页面如下所示
下面的登录页面代表我们当前的配置。 如果某些默认设置不符合我们的需求,我们可以轻松更新配置。
<c:url value="/login" var="loginUrl"/>
<form action="${loginUrl}" method="post"> 1
<c:if test="${param.error != null}"> 2
<p>
Invalid username and password.
</p>
</c:if>
<c:if test="${param.logout != null}"> 3
<p>
You have been logged out.
</p>
</c:if>
<p>
<label for="username">Username</label>
<input type="text" id="username" name="username"/> 4
</p>
<p>
<label for="password">Password</label>
<input type="password" id="password" name="password"/> 5
</p>
<input type="hidden" 6
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
<button type="submit" class="btn">Log in</button>
</form>
1 对/ login URL的POST将尝试对用户进行身份验证
2 如果存在查询参数错误,则尝试进行身份验证并失败
3 如果存在查询参数注销,则表示用户已成功注销
4 用户名必须作为名为username的HTTP参数出现
5.密码必须作为名为password的HTTP参数出现
6我们必须在“包含CSRF令牌”一节中了解更多信息,请参阅第10.6节“跨站点请求伪造(CSRF)”部分的参考.
1.3 Authorize Requests
我们的示例仅要求用户进行身份验证,并且已针对应用程序中的每个URL进行了身份验证。 我们可以通过向http.authorizeRequests()方法添加多个子项来指定URL的自定义要求。 例如:
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() 1
.antMatchers("/resources/**", "/signup", "/about").permitAll() 2
.antMatchers("/admin/**").hasRole("ADMIN") 3
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") 4
.anyRequest().authenticated() 5
.and()
// ...
.formLogin();
}
-
1.http.authorizeRequests()方法有多个子节点,每个匹配器按其声明的顺序进行考虑。
-
2我们指定了任何用户都可以访问的多种URL模式。 具体来说,如果URL以“/ resources /”开头,等于“/ signup”或等于“/ about”,则任何用户都可以访问请求。
-
3 任何以“/ admin /”开头的URL都将仅限于具有“ROLE_ADMIN”角色的用户。 您会注意到,由于我们正在调用hasRole方法,因此我们不需要指定“ROLE_”前缀。
-
4 任何以“/ db /”开头的URL都要求用户同时拥有“ROLE_ADMIN”和“ROLE_DBA”。 您会注意到,由于我们使用的是hasRole表达式,因此我们不需要指定“ROLE_”前缀。
-
5 任何尚未匹配的URL只需要对用户进行身份验证






还没有评论,来说两句吧...