zoukankan      html  css  js  c++  java
  • spring-security doc logout

    18.5.3 Logging Out

    Adding CSRF will update the LogoutFilter to only use HTTP POST. This ensures that log out requires a CSRF token and that a malicious user cannot forcibly log out your users.

    One approach is to use a form for log out. If you really want a link, you can use JavaScript to have the link perform a POST (i.e. maybe on a hidden form). For browsers with JavaScript that is disabled, you can optionally have the link take the user to a log out confirmation page that will perform the POST.

    If you really want to use HTTP GET with logout you can do so, but remember this is generally not recommended. For example, the following Java Configuration will perform logout with the URL /logout is requested with any HTTP method:

    @EnableWebSecurity
    public class WebSecurityConfig extends
    WebSecurityConfigurerAdapter {
    
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    		http
    			.logout()
    				.logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    	}
    }

    http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#csrf-logout

    34down voteaccepted

    From the Spring Security documentation

    CSRF protection is enabled by default with Java configuration. If you would like to disable CSRF, the corresponding Java configuration can be seen below. Refer to the Javadoc of csrf() for additional customizations in how CSRF protection is configured.

    And, when CSRF protection is enabled

    The last step is to ensure that you include the CSRF token in all PATCH, POST, PUT, and DELETE methods.

    In your case:

    • you have CSRF protection enabled by default (because you are using Java configuration),
    • you are submitting the login form using an HTTP POST and
    • are not including the CSRF token in the login form. For this reason, your login request is denied upon submission because the CSRF protection filter cannot find the CSRF token in the incoming request.

    You have already determined the possible solutions:

    1. Disable CSRF protection as http.csrf().disable(); or
    2. Include the CSRF token in the login form as a hidden parameter.

    Since you are using Thymeleaf, you will have to do something like the following in your HTML template for the login page:

    <form name="f" th:action="@{/login}" method="post">               
      <fieldset>
    
        <input type="hidden" 
               th:name="${_csrf.parameterName}" 
               th:value="${_csrf.token}" />
    
        ...
      </fieldset>
    </form>

    Note that you must use th:action and not HTML action as the Thymeleaf CSRF processor will kick-in only with the former.

    You could change the form submission method to GET just to get over the problem but that isn't recommended since the users are going to submit sensitive information in the form.

    I typically create a Thymeleaf fragment that is then used in all pages with forms to generate the markup for the forms with the CSRF token included. This reduces boilerplate code across the app.

    https://stackoverflow.com/questions/25692735/simple-example-of-spring-security-with-thymeleaf

  • 相关阅读:
    CentOS修改hosts文件及生效命令
    Elasticsearch处理 空对象问题
    Windows查看某个端口被占用的解决方法
    PHP Fatal error: Uncaught Error: Class ‘\Elasticsearch\Serializers\SmartSerializer‘ not found in /h
    浏览器正常导出文件phpecxel
    ElasticsearchPHP 快速开始
    MySQL为什么选择B+树存储索引
    PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法
    Zoom支持自动生成字幕;SharePlay上线;Safari 更新导致大量bug |WebRTC风向
    日均请求量1.6万亿次背后,DNSPod的秘密国密DoH篇
  • 原文地址:https://www.cnblogs.com/softidea/p/7088110.html
Copyright © 2011-2022 走看看