Spring Security(十四):5.4 Authorize Requests
Our examples have only required users to be authenticated and have done so for every URL in our application. We can specify custom requirements for our URLs by adding multiple children to our http.authorizeRequests()
method. For example:
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、There are multiple children to the http.authorizeRequests() method each matcher is considered in the order they were declared.
2、We specified multiple URL patterns that any user can access. Specifically, any user can access a request if the URL starts with "/resources/", equals "/signup", or equals "/about".
3、Any URL that starts with "/admin/" will be restricted to users who have the role "ROLE_ADMIN". You will notice that since we are invoking the hasRole method we do not need to specify the "ROLE_" prefix.
4、Any URL that starts with "/db/" requires the user to have both "ROLE_ADMIN" and "ROLE_DBA". You will notice that since we are using the hasRole expression we do not need to specify the "ROLE_" prefix.
5、Any URL that has not already been matched on only requires that the user be authenticated
5.5 Handling Logouts 处理注销
When using the WebSecurityConfigurerAdapter
, logout capabilities are automatically applied. The default is that accessing the URL /logout
will log the user out by:
- Invalidating the HTTP Session
-
使HTTP会话无效
- Cleaning up any RememberMe authentication that was configured
-
清理已配置的任何RememberMe身份验证
- Clearing the
SecurityContextHolder
-
清除SecurityContextHolder
- Redirect to
/login?logout
- 重定向到/ login?logout
Similar to configuring login capabilities, however, you also have various options to further customize your logout requirements:
protected void configure(HttpSecurity http) throws Exception { http .logout() 1 .logoutUrl("/my/logout") 2 .logoutSuccessUrl("/my/index") 3 .logoutSuccessHandler(logoutSuccessHandler) 4 .invalidateHttpSession(true) 5 .addLogoutHandler(logoutHandler) 6 .deleteCookies(cookieNamesToClear) 7 .and() ... }
1、Provides logout support. This is automatically applied when using WebSecurityConfigurerAdapter.
2、The URL that triggers log out to occur (default is /logout). If CSRF protection is enabled (default), then the request must also be a POST. For more information, please consult the JavaDoc.
3、The URL to redirect to after logout has occurred. The default is /login?logout. For more information, please consult the JavaDoc.
4、Let’s you specify a custom LogoutSuccessHandler. If this is specified, logoutSuccessUrl() is ignored. For more information, please consult the JavaDoc.
5、Specify whether to invalidate the HttpSession at the time of logout. This is true by default. Configures the SecurityContextLogoutHandler under the covers. For more information, please consult the JavaDoc.
6、Adds a LogoutHandler. SecurityContextLogoutHandler is added as the last LogoutHandler by default.
7、Allows specifying the names of cookies to be removed on logout success. This is a shortcut for adding a CookieClearingLogoutHandler explicitly.
LogoutHandler
and/or LogoutSuccessHandler
implementations. For many common scenarios, these handlers are applied under the covers when using the fluent API.5.5.1 LogoutHandler (登出处理)
Generally, LogoutHandler
implementations indicate classes that are able to participate in logout handling. They are expected to be invoked to perform necessary clean-up. As such they should not throw exceptions. Various implementations are provided:
- PersistentTokenBasedRememberMeServices
- TokenBasedRememberMeServices
- CookieClearingLogoutHandler
- CsrfLogoutHandler
- SecurityContextLogoutHandler
Please see Section 17.4, “Remember-Me Interfaces and Implementations” for details.
LogoutHandler
implementations directly, the fluent API also provides shortcuts that provide the respective LogoutHandler
implementations under the covers. E.g. deleteCookies()
allows specifying the names of one or more cookies to be removed on logout success. This is a shortcut compared to adding aCookieClearingLogoutHandler
.- SimpleUrlLogoutSuccessHandler
- HttpStatusReturningLogoutSuccessHandler
As mentioned above, you don’t need to specify the SimpleUrlLogoutSuccessHandler
directly. Instead, the fluent API provides a shortcut by setting the logoutSuccessUrl()
. This will setup the SimpleUrlLogoutSuccessHandler
under the covers. The provided URL will be redirected to after a logout has occurred. The default is /login?logout
.
5.5.3 Further Logout-Related References
- Logout Handling
- Testing Logout
- HttpServletRequest.logout()
- Section 17.4, “Remember-Me Interfaces and Implementations”
- Logging Out in section CSRF Caveats
- Section Single Logout (CAS protocol)
- Documentation for the logout element in the Spring Security XML Namespace section