{"id":249,"date":"2022-03-31T16:30:12","date_gmt":"2022-03-31T08:30:12","guid":{"rendered":"https:\/\/blog.lijiajia.top\/?p=249"},"modified":"2026-06-19T21:30:23","modified_gmt":"2026-06-19T13:30:23","slug":"springsecurity%e6%a1%86%e6%9e%b6%e5%ad%a6%e4%b9%a0%ef%bc%9a%e8%87%aa%e5%8a%a8%e7%99%bb%e5%bd%95-%e8%ae%b0%e4%bd%8f%e6%88%91%e5%8d%81%e4%b8%80","status":"publish","type":"post","link":"https:\/\/blog.ttwow.top\/?p=249","title":{"rendered":"SpringSecurity\u6846\u67b6\u5b66\u4e60\uff1a\u81ea\u52a8\u767b\u5f55-\u8bb0\u4f4f\u6211(\u5341\u4e00)"},"content":{"rendered":"<h2>\u6e90\u7801\u5b9e\u73b0<\/h2>\n<p>RememberMeServices<br \/>\nJdbcTokenRepositoryImpl<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/03\/image-1648715624663.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/03\/image-1648715624663.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h2>\u6280\u672f\u5b9e\u73b0<\/h2>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/03\/image-1648715646157.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/03\/image-1648715646157.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h2>SQL\u8bb0\u5f55\u8868<\/h2>\n<pre><code class=\"language-sql\">CREATE TABLE <code>persistent_logins<\/code> (\n  <code>username<\/code> varchar(64) NOT NULL,\n  <code>series<\/code> varchar(64) NOT NULL,\n  <code>token<\/code> varchar(64) NOT NULL,\n  <code>last_used<\/code> timestamp NOT NULL,\n  PRIMARY KEY (<code>series<\/code>)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;<\/code><\/pre>\n<h2>\u9875\u9762\uff1a<\/h2>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;title&gt;\u767b\u5f55&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n        &lt;form action=&quot;\/user\/login&quot; method=&quot;post&quot; &gt;\n            \u7528\u6237\u540d\uff1a&lt;input type=&quot;text&quot; name=&quot;username&quot;&gt;\n            &lt;br\/&gt;\n            \u5bc6\u7801\uff1a&lt;input type=&quot;text&quot; name=&quot;password&quot;&gt;\n            &lt;br\/&gt;\n            &lt;input type=&quot;checkbox&quot; name=&quot;remember-me&quot;&gt;\u81ea\u52a8\u767b\u5f55\n            &lt;br\/&gt;\n            &lt;input type=&quot;submit&quot; value=&quot;\u767b\u5f55&quot;&gt;\n            &lt;br\/&gt;\n\n        &lt;\/form&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<h2>\u914d\u7f6e\u7c7b<\/h2>\n<pre><code class=\"language-java\">package com.example.springsecuritydemo01.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.security.crypto.password.PasswordEncoder;\nimport org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;\nimport org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;\n\nimport javax.sql.DataSource;\n\n@Configuration\npublic class SecurityConfigDiy extends WebSecurityConfigurerAdapter {\n\n    @Autowired\n    private UserDetailsService userDetailsService;\n\n    @Autowired\n    private DataSource dataSource;\n\n    @Bean\n    public PersistentTokenRepository persistentTokenRepository(){\n        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();\n        jdbcTokenRepository.setDataSource(dataSource);\n        \/\/\u81ea\u52a8\u521b\u5efa\u81ea\u52a8\u767b\u5f55\u4fe1\u606f\u8bb0\u5f55\u8868\n\/\/        jdbcTokenRepository.setCreateTableOnStartup(true);\n        return jdbcTokenRepository;\n    }\n\n    @Override\n    protected void configure(AuthenticationManagerBuilder auth) throws Exception{\n        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());\n    }\n\n    @Bean\n    PasswordEncoder passwordEncoder(){\n        return new BCryptPasswordEncoder();\n    }\n\n    @Override\n    protected void configure(HttpSecurity httpSecurity) throws Exception{\n\n        \/\/\u9000\u51fa\n        httpSecurity.logout().logoutUrl(&quot;\/logout&quot;)  \/\/\u9000\u51fa\u8def\u5f84\n                        .logoutSuccessUrl(&quot;\/test\/hello&quot;)    \/\/\u9000\u51fa\u6210\u529f\u7684\u8def\u5f84\n                        .permitAll();\n\n        httpSecurity.exceptionHandling().accessDeniedPage(&quot;\/unauth.html&quot;);\n\n        httpSecurity.formLogin()    \/\/\u81ea\u5b9a\u4e49\u81ea\u5df1\u7f16\u5199\u7684\u767b\u5f55\u9875\u9762\n                .loginPage(&quot;\/login.html&quot;)    \/\/\u767b\u5f55\u9875\u9762\u8bbe\u7f6e\n                .loginProcessingUrl(&quot;\/user\/login&quot;)  \/\/\u767b\u5f55\u8bbf\u95ee\u8def\u5f84 \u6309\u767b\u5f55\u6309\u94ae\u540e\u8df3\u8f6c\u8def\u5f84\n                .defaultSuccessUrl(&quot;\/success.html&quot;).permitAll()   \/\/\u767b\u5f55\u6210\u529f\u4e4b\u540e,\u8df3\u8f6c\u8def\u5f84\n                .and().authorizeRequests()\n                .antMatchers(&quot;\/&quot;,&quot;\/test\/hello&quot;,&quot;\/user\/login&quot;).permitAll()   \/\/\u8bbe\u7f6e\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u7684\u8def\u5f84\n                \/\/1.hasAuthority\u65b9\u6cd5\n                \/\/.antMatchers(&quot;\/test\/index&quot;).hasAuthority(&quot;admins&quot;)\n                \/\/2.hasAnyAuthority\u65b9\u6cd5\n                \/\/.antMatchers(&quot;\/test\/index&quot;).hasAnyAuthority(&quot;admins&quot;,&quot;query&quot;)\n                \/\/3.hasRole\u65b9\u6cd5 ROLE_sale\n                \/\/.antMatchers(&quot;\/test\/index&quot;).hasRole(&quot;sale&quot;)\n                \/\/4.hasAnyRole ROLE_admin\n                .antMatchers(&quot;\/test\/index&quot;).hasAnyRole(&quot;admin22&quot;)\n                .anyRequest().authenticated()\n\n                .and().rememberMe().tokenRepository(persistentTokenRepository())\n                .tokenValiditySeconds(60*60)\/\/\u8bbe\u7f6e\u6709\u6548\u65f6\u957f \u5355\u4f4d \u79d2\n                .userDetailsService(userDetailsService)\n\n                .and().csrf().disable();    \/\/\u5173\u95edcsrf\u9632\u62a4\n\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6e90\u7801\u5b9e\u73b0 RememberMeServices JdbcTokenRepositoryImpl \u6280\u672f\u5b9e\u73b0 SQ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[125],"tags":[72],"class_list":["post-249","post","type-post","status-publish","format-standard","hentry","category-java-backend","tag-springsecurity"],"_links":{"self":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=249"}],"version-history":[{"count":1,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/249\/revisions"}],"predecessor-version":[{"id":2100,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/249\/revisions\/2100"}],"wp:attachment":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}