{"id":2537,"date":"2021-02-07T11:19:35","date_gmt":"2021-02-07T02:19:35","guid":{"rendered":"https:\/\/loglog.xyz\/?p=2537"},"modified":"2023-09-24T13:01:36","modified_gmt":"2023-09-24T04:01:36","slug":"springsecurity_login","status":"publish","type":"post","link":"https:\/\/loglog.xyz\/programming\/springsecurity_login","title":{"rendered":"\u3010SpringSecurity\u3011#1\uff5e \u30ed\u30b0\u30a4\u30f3\u753b\u9762\u306e\u5b9f\u88c5(\u8a8d\u8a3c)"},"content":{"rendered":"<h2>\u6982\u8981<\/h2>\n<p>SpringSecurity\u3092\u5c0e\u5165\u3057\u3066\u30e6\u30fc\u30b6\u8a8d\u8a3c\u6a5f\u80fd\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<br \/>\n\u307e\u305a\u306f\u30ed\u30b0\u30a4\u30f3\u8a8d\u8a3c\u6a5f\u80fd\u304c\u4f7f\u3048\u308b\u3088\u3046\u306b\u306a\u308b\u3053\u3068\u3092\u76ee\u6a19\u306b\u3057\u3066\u3044\u307e\u3059\u306e\u3067\u3001<br \/>\n\u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3059\u308b\u69cb\u6210\u306f\u6700\u5c0f\u9650\u306b\u3068\u3069\u3081\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2>\u6e96\u5099<\/h2>\n<p>SpringSecurity\u3067\u8a8d\u8a3c\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u307e\u305a\u306f\u74b0\u5883\u3092\u6e96\u5099\u3057\u307e\u3059\u3002<\/p>\n<h3>\u69cb\u6210\u7ba1\u7406<\/h3>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u69cb\u6210\u7ba1\u7406\u306fMaven\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\nMaven\u3067\u306fpom.xml\u306bSpringSecurity\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u5229\u7528\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<h3>\u30e6\u30fc\u30b6\u30c6\u30fc\u30d6\u30eb<\/h3>\n<p>\u30e6\u30fc\u30b6\u60c5\u5831\u3092\u683c\u7d0d\u3059\u308b\u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<br \/>\n\u30e6\u30fc\u30b6ID\u3001\u540d\u524d\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u3001\u30ed\u30fc\u30eb\u304c\u3042\u308c\u3070\u3088\u3044\u3067\u3059\u3002<br \/>\n\u4ee5\u4e0b\u306f\u6163\u4f8b\u3068\u3057\u3066\u3001\u4f5c\u6210\u65e5\u6642\u7b49\u306e\u5171\u901a\u30ab\u30e9\u30e0\u3082\u542b\u3081\u305fDDL\u3067\u3059\u3002<\/p>\n<pre class=\"lang:pgsql decode:true \">-- DDL\r\nCREATE TABLE `book_management`.`customer` (\r\n  `id` VARCHAR(100) NOT NULL,\r\n  `name` VARCHAR(100) NOT NULL,\r\n  `password` VARCHAR(100) NOT NULL,\r\n  `role` VARCHAR(50) NOT NULL,\r\n  `created_user` VARCHAR(100) NOT NULL,\r\n  `created_at` DATETIME NOT NULL,\r\n  `updated_user` VARCHAR(100) NOT NULL,\r\n  `updated_at` DATETIME NOT NULL,\r\n  `deleted_user` VARCHAR(100) NULL,\r\n  `deleted_at` DATETIME NULL,\r\n  `version` INT NOT NULL,\r\n  PRIMARY KEY (`id`))\r\nENGINE = InnoDB\r\nDEFAULT CHARACTER SET = utf8mb4;\r\n<\/pre>\n<pre class=\"lang:pgsql decode:true \">-- \u30a4\u30f3\u30dd\u30fc\u30c8\u30c7\u30fc\u30bf\r\nINSERT INTO `book_management`.`customer`\r\n(`id`,\r\n`name`,\r\n`password`,\r\n`role`,\r\n`created_user`,\r\n`created_at`,\r\n`updated_user`,\r\n`updated_at`,\r\n`deleted_user`,\r\n`deleted_at`,\r\n`version`)\r\nVALUES\r\n('admin','\u7ba1\u7406\u8005','$2a$10$F9PClZY7wQBuNHRzqI55rug.3mN55lH6M1.BRYT.rat1hQeij\/TJ6','ROLE_ADMIN','system','2021-01-30 19:55:00','system','2021-01-30 19:55:00',null,null,'0'),\r\n('user','\u4e00\u822c\u30e6\u30fc\u30b6','$2a$10$F9PClZY7wQBuNHRzqI55rug.3mN55lH6M1.BRYT.rat1hQeij\/TJ6','ROLE_USER','system','2021-01-30 19:55:00','system','2021-01-30 19:55:00',null,null,'0'),\r\n('super','\u30b9\u30fc\u30d1\u30fc\u30e6\u30fc\u30b6','$2a$10$F9PClZY7wQBuNHRzqI55rug.3mN55lH6M1.BRYT.rat1hQeij\/TJ6','ROLE_ADMIN,ROLE_USER','system','2021-01-30 19:55:00','system','2021-01-30 19:55:00',null,null,'0');\r\n\r\n<\/pre>\n<p>\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u3001\u300cpassword\u300d\u3092BCryptPasswordEncoder()\u3067\u30a8\u30f3\u30b3\u30fc\u30c9\u3057\u305f\u5024\u3092\u4fdd\u6301\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2>\u5b9f\u88c5<\/h2>\n<h3>SpringSecurity\u306e\u8a2d\u5b9a<\/h3>\n<p>\u914d\u7f6e\u5834\u6240\uff1a\/src\/main\/java\/com\/example\/demo\/SecurityConfig.java<\/p>\n<pre class=\"lang:java decode:true \">package com.example.demo;\r\n\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\r\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\r\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\r\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\r\nimport org.springframework.security.crypto.password.PasswordEncoder;\r\n\r\n@Configuration\r\n@EnableWebSecurity\r\npublic class SecurityConfig extends WebSecurityConfigurerAdapter {\r\n\r\n    @Bean\r\n    public PasswordEncoder passwordEncoder() {\r\n        return new BCryptPasswordEncoder();\r\n    }\r\n\r\n\t@Override\r\n\tprotected void configure(HttpSecurity http) throws Exception {\r\n\t\thttp.authorizeRequests()\r\n\t\t\t.antMatchers(\"\/css\/**\", \"\/js\/**\").permitAll()\r\n\t\t\t.antMatchers(\"\/admin\/**\").hasAuthority(\"ROLE_ADMIN\")\r\n\t\t\t.anyRequest().authenticated();\r\n\r\n\t\thttp.formLogin()\r\n\t\t    .usernameParameter(\"username\")\r\n\t\t    .passwordParameter(\"password\")\r\n\t\t\t.defaultSuccessUrl(\"\/\", true)\r\n\t\t\t.failureUrl(\"\/login-error\");\r\n\r\n\/\/\t\tSystem.out.println(\"password : \" + passwordEncoder().encode(\"password\"));\r\n\t}\r\n}<\/pre>\n<p><strong>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>@Configuration<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u8a2d\u5b9a\u7528\u30af\u30e9\u30b9\u3067\u3042\u308b\u3053\u3068\u3092\u793a\u3059\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>@EnableWebSecurity<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Spring Security\u306e\u30a6\u30a7\u30d6\u7528\u306e\u6a5f\u80fd\u3092\u5229\u7528\u3059\u308b\u305f\u3081\u306e\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3<\/p>\n<p><strong>http.authorizeRequests()<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>antMatchers(&#8220;\/hoge\/**&#8221;)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u4e00\u81f4\u3059\u308b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u6307\u5b9a\u3067\u3059\u3002(\u4e0a\u8a18\u4f8b\u306f\u3001hoge\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u914d\u4e0b\u5168\u3066\u3092\u793a\u3059)<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>permitAll()<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u30a2\u30af\u30bb\u30b9\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>asAuthority(&#8220;ROLE_ADMIN&#8221;)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u6307\u5b9a\u3057\u305f\uff08ROLE_ADMIN\uff09\u306e\u6a29\u9650\u3092\u6709\u3059\u308b\u30e6\u30fc\u30b6\u306e\u307f\u30a2\u30af\u30bb\u30b9\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>anyRequest().authenticated()<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u6761\u4ef6\u306b\u4e00\u81f4\u3057\u306a\u3044\u3059\u3079\u3066\u306eURL\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306f\u3001\u30e6\u30fc\u30b6\u8a8d\u8a3c\u306e\u307f\u3092\u8981\u6c42\u3057\u307e\u3059\u3002<\/p>\n<p><strong>formLogin()<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>usernameParameter(&#8220;username&#8221;)\u3001passwordParameter(&#8220;password&#8221;)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u30ed\u30b0\u30a4\u30f3\u753b\u9762\u306ename\u5c5e\u6027(&#8220;username&#8221;\u7b49)\u3092\u3001<br \/>\n\u30ed\u30b0\u30a4\u30f3\u30e6\u30fc\u30b6\u540d\u3068\u30ed\u30b0\u30a4\u30f3\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u3057\u3066\u53d6\u5f97\u3059\u308b\u3002<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>defaultSuccessUrl(&#8220;\/&#8221;, true)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u7b2c1\u5f15\u6570\u306f\u30ed\u30b0\u30a4\u30f3\u6210\u529f\u6642\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30a2\u30af\u30bb\u30b9URL\u3067\u3059\u3002<br \/>\n\u7b2c2\u5f15\u6570\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u30a2\u30af\u30bb\u30b9URL\u3078\u306e\u9077\u79fb\u3092\u5f37\u5236\u3059\u308b\u304b\u306e\u6307\u5b9a\u3067\u3059\u3002<br \/>\ntrue \uff1a&#8221;\/&#8221;\u306b\u9077\u79fb<br \/>\nfalse\uff1a\u8a8d\u8a3c\u524d\u306b\u9077\u79fb\u3057\u3088\u3046\u3068\u3057\u305f\u9077\u79fb\u5148<br \/>\n(&#8220;\/hoge\/page\/1&#8243;\u306b\u9077\u79fb\u3057\u3088\u3046\u3068\u3057\u3066\u30ed\u30b0\u30a4\u30f3\u8a8d\u8a3c\u3092\u8981\u6c42\u3055\u308c\u305f\u5834\u5408\u3001\u30ed\u30b0\u30a4\u30f3\u5f8c\u306f&#8221;\/hoge\/page\/1&#8243;\u306b\u9077\u79fb\u3059\u308b)<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>failureUrl(&#8220;\/login-error&#8221;)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u30ed\u30b0\u30a4\u30f3\u8a8d\u8a3c\u306b\u5931\u6557\u3057\u305f\u5834\u5408\u306b\u9077\u79fb\u3059\u308bURL\u3002<\/p>\n<p><strong><code>System.out.println(\"password : \" + passwordEncoder().encode(\"password\"));<\/code><\/strong><br \/>\n\u21d2\u30a4\u30f3\u30dd\u30fc\u30c8\u30c7\u30fc\u30bf\u306e\u300cpassword\u300d\u3092\u30a8\u30f3\u30b3\u30fc\u30c9\u3059\u308b\u305f\u3081\u306b\u4eee\u5b9f\u88c5\u3057\u305f\u3082\u306e\u3002<\/p>\n<h3>\u30ed\u30b0\u30a4\u30f3\u8a8d\u8a3c\u6a5f\u80fd<\/h3>\n<p><span class=\"huto\">Model<\/span><br \/>\n\u30e6\u30fc\u30b6\u60c5\u5831\u30c6\u30fc\u30d6\u30eb(Customer)\u306b\u5bfe\u5fdc\u3059\u308bModel\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u7528\u610f\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"lang:java decode:true \">package com.example.demo.domain.model;\r\n\r\nimport java.util.Date;\r\n\r\nimport lombok.Data;\r\n\r\n@Data\r\npublic class Customer {\r\n\tprivate String id;\r\n\tprivate String name;\r\n\tprivate String password;\r\n\tprivate String role;\r\n\tprivate String created_user;\r\n\tprivate Date created_at;\r\n\tprivate String updated_user;\r\n\tprivate Date updated_at;\r\n\tprivate String deleted_user;\r\n\tprivate Date deleted_at;\r\n\tprivate int version;\r\n}\r\n<\/pre>\n<p><span class=\"huto\">Repository<\/span><br \/>\n\u30e6\u30fc\u30b6\u60c5\u5831\u30c6\u30fc\u30d6\u30eb(Customer)\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u3092\u7528\u610f\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"lang:java decode:true \">package com.example.demo.domain.repository;\r\n\r\nimport org.apache.ibatis.annotations.Mapper;\r\n\r\nimport com.example.demo.domain.model.Customer;\r\n\r\n@Mapper\r\npublic interface CustomerRepository {\r\n\tpublic Customer findById(String username);\r\n}\r\n<\/pre>\n<p><span class=\"huto\">Mapper<\/span><br \/>\nMapper\u7528\u306eXML\u3092\u7528\u610f\u3057\u307e\u3059\u3002<br \/>\nRepository\u3068\u540c\u3058\u968e\u5c64\u3068\u306a\u308b\u3088\u3046\u306b\u914d\u7f6e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u306e\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u307e\u3059\u3002<br \/>\n\u307e\u305f\u3001\u540d\u79f0\u3082\u540c\u3058\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u306e\u3067\u63c3\u3048\u3066\u304a\u304d\u307e\u3059\u3002<br \/>\n<span class=\"komozi\">Repository\uff1asrc\/main\/java\/com\/example\/demo\/domain\/repository\/CustomerRepository.java<br \/>\nXML\u3000\u3000\u3000\uff1asrc\/main\/resources\/com\/example\/demo\/domain\/repository\/CustomerRepository.xml<\/span><\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;!DOCTYPE mapper PUBLIC \"-\/\/mybatis.org\/\/DTD Mapper 3.0\/\/EN\"\r\n \"http:\/\/mybatis.org\/dtd\/mybatis-3-mapper.dtd\"&gt;\r\n\r\n&lt;mapper namespace=\"com.example.demo.domain.repository.CustomerRepository\"&gt;\r\n  &lt;resultMap type=\"com.example.demo.domain.model.Customer\" id=\"customer\"&gt;\r\n\t&lt;id column=\"id\" property=\"id\"&gt;&lt;\/id&gt;\r\n\t&lt;result column=\"name\" property=\"name\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"password\" property=\"password\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"role\" property=\"role\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"created_user\" property=\"created_user\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"created_at\" property=\"created_at\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"updated_user\" property=\"updated_user\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"updated_at\" property=\"updated_at\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"deleted_user\" property=\"deleted_user\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"deleted_at\" property=\"deleted_at\"&gt;&lt;\/result&gt;\r\n\t&lt;result column=\"version\" property=\"version\"&gt;&lt;\/result&gt;\r\n  &lt;\/resultMap&gt;\r\n\r\n  &lt;select id=\"findById\" resultMap=\"customer\"&gt;\r\n    SELECT * FROM customer WHERE id = #{username} AND deleted_at IS NULL\r\n  &lt;\/select&gt;\r\n\r\n&lt;\/mapper&gt;\r\n<\/pre>\n<p><span class=\"huto\">UserDetails<\/span><br \/>\nUserDetails\u3092\u7d99\u627f\u3057\u305fCustomerDetails\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<br \/>\n\u3053\u308c\u306f\u30e6\u30fc\u30b6\u60c5\u5831\u3092\u4fdd\u6301\u3059\u308b\u30af\u30e9\u30b9\u3067\u3042\u308a\u3001\u6a29\u9650\u3084\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u72b6\u614b\u3092\u6271\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"lang:java decode:true \">package com.example.demo;\r\n\r\nimport java.util.Collection;\r\n\r\nimport org.springframework.security.core.GrantedAuthority;\r\nimport org.springframework.security.core.authority.AuthorityUtils;\r\nimport org.springframework.security.core.userdetails.UserDetails;\r\n\r\nimport com.example.demo.domain.model.Customer;\r\n\r\npublic class CustomerDetails implements UserDetails {\r\n\r\n\tprivate Customer customer;\r\n\r\n\tpublic CustomerDetails(Customer customer) {\r\n\t\tthis.customer = customer;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Collection&lt;? extends GrantedAuthority&gt; getAuthorities() {\r\n\t\treturn AuthorityUtils.createAuthorityList(customer.getRole().split(\",\"));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getPassword() {\r\n\t\treturn customer.getPassword();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getUsername() {\r\n\t\treturn customer.getName();\r\n\t}\r\n\r\n\t@Override\r\n\t\/\/ \u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u6709\u52b9\u671f\u9650\u5185\u3067\u3042\u308b\u304b\r\n\tpublic boolean isAccountNonExpired() {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t@Override\r\n\t\/\/ \u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u306a\u3044\u304b\r\n\tpublic boolean isAccountNonLocked() {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t@Override\r\n\t\/\/\t\u8cc7\u683c\u60c5\u5831\u304c\u6709\u52b9\u671f\u9650\u5185\u3067\u3042\u308b\u304b\r\n\tpublic boolean isCredentialsNonExpired() {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t@Override\r\n\t\/\/ \u6709\u52b9\u306a\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u3042\u308b\u304b\r\n\tpublic boolean isEnabled() {\r\n\t\treturn true;\r\n\t}\r\n\r\n}\r\n<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>getAuthorities()<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u6a29\u9650\u3092Collection\u3067\u8fd4\u3057\u307e\u3059\u3002<br \/>\n\u30e6\u30fc\u30b6\u60c5\u5831\u30c6\u30fc\u30d6\u30eb(Customer)\u3067\u306f\u3001role\u30ab\u30e9\u30e0\u5185\u306b,(\u30ab\u30f3\u30de)\u3067\u533a\u5207\u3063\u3066\u8907\u6570\u306e\u6a29\u9650\u3092\u4fdd\u6301\u3059\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u306e\u3067\u3001AuthorityUtils.createAuthorityList\u30e1\u30bd\u30c3\u30c9\u306e\u5f15\u6570\u306b\u3001\u30ab\u30f3\u30de\u3067split\u3057\u305f\u7d50\u679c\u306e\u914d\u5217\u3092\u8fd4\u3059\u3053\u3068\u3068\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\n\u203bsuper\u30e6\u30fc\u30b6\u306erole\u30ab\u30e9\u30e0\u3092\u53c2\u7167<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>getPassword(), getUsername()<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u30e6\u30fc\u30b6ID\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u8fd4\u3059Getter\u3067\u3059\u3002<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired(), isEnabled()<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u6709\u52b9\u3067\u3042\u308b\u304b\u3092\u691c\u8a3c\u3059\u308b\u5404\u7a2e\u306e\u8a2d\u5b9a\u3067\u3059\u3002<br \/>\n\u7279\u306b\u5b9f\u88c5\u306f\u304a\u3053\u306a\u3044\u307e\u305b\u3093\u304c\u3001\u30ed\u30b0\u30a4\u30f3\u3067\u304d\u308b\u3088\u3046\u306b\u5168\u3066true\u306b\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p><span class=\"huto\">Service<\/span><br \/>\nUserDetailsService\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u305fCustomerServce\u30af\u30e9\u30b9\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<br \/>\n\u691c\u7d22\u3059\u308b\u30e6\u30fc\u30b6\u304c\u5b58\u5728\u3059\u308c\u3070\u3001UserDetails\u3092\u8fd4\u3057\u307e\u3059\u3002<br \/>\n\u3082\u3057\u306a\u3051\u308c\u3070\u3001UsernameNotFoundException\u304cthrow\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"lang:java decode:true \">package com.example.demo.service;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.security.core.userdetails.UserDetails;\r\nimport org.springframework.security.core.userdetails.UserDetailsService;\r\nimport org.springframework.security.core.userdetails.UsernameNotFoundException;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.example.demo.CustomerDetails;\r\nimport com.example.demo.domain.model.Customer;\r\nimport com.example.demo.domain.repository.CustomerRepository;\r\n\r\n@Service\r\npublic class CustomerServce implements UserDetailsService {\r\n\t@Autowired\r\n\tprivate CustomerRepository customerRepository;\r\n\r\n\t@Override\r\n\tpublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {\r\n\t\tCustomer customer = customerRepository.findById(username);\r\n\t\tif(customer == null) {\r\n\t\t\tthrow new UsernameNotFoundException(username + \" is not found\");\r\n\t\t}\r\n\t\treturn new CustomerDetails(customer);\r\n\t}\r\n\r\n}\r\n<\/pre>\n<h3>\u30ed\u30b0\u30a4\u30f3\u753b\u9762<\/h3>\n<p><img decoding=\"async\" width=\"427\" height=\"333\" alt=\"\" class=\"alignnone size-full wp-image-2547 \" src=\"https:\/\/loglog.xyz\/wp-content\/uploads\/2021\/02\/img_601f45d10b5ad.png\" srcset=\"https:\/\/loglog.xyz\/wp-content\/uploads\/2021\/02\/img_601f45d10b5ad.png 427w, https:\/\/loglog.xyz\/wp-content\/uploads\/2021\/02\/img_601f45d10b5ad-300x234.png 300w\" sizes=\"(max-width: 427px) 100vw, 427px\" \/><br \/>\nSpringSecurity\u3067\u81ea\u52d5\u751f\u6210\u3055\u308c\u308b\u30ed\u30b0\u30a4\u30f3\u30da\u30fc\u30b8\u3067\u3059\u3002<br \/>\n\u72ec\u81ea\u306e\u30ed\u30b0\u30a4\u30f3\u753b\u9762\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3082\u53ef\u80fd\u306a\u306e\u3067\u3001\u8208\u5473\u306e\u3042\u308b\u65b9\u306f\u66f4\u306b\u8e0f\u307f\u8fbc\u3093\u3067\u307f\u3066\u4e0b\u3055\u3044\u3002<br \/>\n(\u53c2\u8003)<br \/>\n<a href=\"https:\/\/loglog.xyz\/programming\/springsecurity_original_login\" title=\"\u3010SpringSecurity\u3011#3\uff5e \u72ec\u81ea\u306e\u30ed\u30b0\u30a4\u30f3\u753b\u9762\" rel=\"noopener\" target=\"_blank\">#3\uff5e \u72ec\u81ea\u306e\u30ed\u30b0\u30a4\u30f3\u753b\u9762<\/a><\/p>\n<h3>\u30ed\u30b0\u30a2\u30a6\u30c8<\/h3>\n<p><img decoding=\"async\" width=\"451\" height=\"196\" alt=\"\" class=\"alignnone size-full wp-image-2550 \" src=\"https:\/\/loglog.xyz\/wp-content\/uploads\/2021\/02\/img_601f4a91677da.png\" srcset=\"https:\/\/loglog.xyz\/wp-content\/uploads\/2021\/02\/img_601f4a91677da.png 451w, https:\/\/loglog.xyz\/wp-content\/uploads\/2021\/02\/img_601f4a91677da-300x130.png 300w\" sizes=\"(max-width: 451px) 100vw, 451px\" \/><\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;a th:href=\"@{\/logout}\"&gt;\u30ed\u30b0\u30a2\u30a6\u30c8&lt;\/a&gt;<\/pre>\n<p>\/logout\u306b\u30ea\u30f3\u30af\u3092\u7528\u610f\u3059\u308b\u3060\u3051\u3067\u30ed\u30b0\u30a2\u30a6\u30c8\u306f\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<br \/>\n\u30ed\u30b0\u30a2\u30a6\u30c8\u753b\u9762\u3092\u72ec\u81ea\u306b\u5b9f\u88c5\u3057\u305f\u3044\u5834\u5408\u306f\u72ec\u81ea\u306b\u5b9f\u88c5\u3059\u308b\u5fc5\u8981\u306f\u3042\u308a\u307e\u3059\u3002<\/p>\n<h2>\u307e\u3068\u3081<\/h2>\n<ul>\n<li>SpringSecurity\u306e\u5c0e\u5165\u306fMaven\u306e\u69cb\u6210\u7ba1\u7406(pom.xml)\u3060\u3068\u7c21\u5358\u306b\u884c\u3048\u308b\u3002<\/li>\n<li>\u30e6\u30fc\u30b6\u7528\u306e\u30c6\u30fc\u30d6\u30eb\u3092\u7528\u610f\u3059\u308b\u3053\u3068\u3002<br \/>\n\u307e\u305f\u3001\u6a29\u9650\u30ab\u30e9\u30e0(role)\u3067\u6a29\u9650\u3092\u8a2d\u5b9a\u53ef\u80fd\u306b\u306a\u308b\u3002<\/li>\n<li>SpringSecuriy\u306e\u8a2d\u5b9a\u7528\u30af\u30e9\u30b9\u306b\u306f\u3001@Configuration\u3068@EnableWebSecurity\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4ed8\u3051\u308b\u3002<\/li>\n<li>\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30ed\u30b0\u30a4\u30f3\u753b\u9762\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u305f\u3044\u5834\u5408\u306e\u307f\u4f5c\u6210\u3059\u308b\u3002<\/li>\n<li>\u30ed\u30b0\u30a2\u30a6\u30c8\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u6a5f\u80fd\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u305f\u3044\u5834\u5408\u306f\u5b9f\u88c5\u3092\u884c\u3046\u3002<\/li>\n<\/ul>\n<h2>\u53c2\u8003<\/h2>\n<p><a href=\"\/\/af.moshimo.com\/af\/c\/click?a_id=4155236&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB08XPBPH9C\" rel=\"nofollow\" referrerpolicy=\"no-referrer-when-downgrade\"><img decoding=\"async\" src=\"https:\/\/images-fe.ssl-images-amazon.com\/images\/I\/51WywNmQaUL._SL160_.jpg\" alt=\"\" style=\"border: none;\" \/><br \/>\n\u5f8c\u6094\u3057\u306a\u3044\u305f\u3081\u306eSpring Boot \u5165\u9580\u66f8\uff1aSpring \u89e3\u4f53\u65b0\u66f8\uff08\u7b2c2\u7248\uff09: Spring Boot\u304c\u4e38\u5206\u304b\u308a Spring\u89e3\u4f53\u65b0\u66f8<\/a><img decoding=\"async\" src=\"\/\/i.moshimo.com\/af\/i\/impression?a_id=4155236&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062\" alt=\"\" width=\"1\" height=\"1\" style=\"border: none;\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8981 SpringSecurity\u3092\u5c0e\u5165\u3057\u3066\u30e6\u30fc\u30b6\u8a8d\u8a3c\u6a5f\u80fd\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002 \u307e\u305a\u306f\u30ed\u30b0\u30a4\u30f3\u8a8d\u8a3c\u6a5f\u80fd\u304c\u4f7f\u3048\u308b\u3088\u3046\u306b\u306a\u308b\u3053\u3068\u3092\u76ee\u6a19\u306b\u3057\u3066\u3044\u307e\u3059\u306e\u3067\u3001 \u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3059\u308b\u69cb\u6210\u306f\u6700\u5c0f\u9650\u306b\u3068\u3069\u3081\u3066\u3044\u307e\u3059\u3002 \u6e96\u5099 SpringSecur [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2255,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":"{\"3a0ddb8a\":{\"pv\":503,\"imp\":208}}","footnotes":""},"categories":[2,65],"tags":[95,157],"class_list":["post-2537","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","category-java","tag-spring","tag-springsecurity"],"_links":{"self":[{"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/posts\/2537","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/comments?post=2537"}],"version-history":[{"count":21,"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/posts\/2537\/revisions"}],"predecessor-version":[{"id":4279,"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/posts\/2537\/revisions\/4279"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/media\/2255"}],"wp:attachment":[{"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/media?parent=2537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/categories?post=2537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/loglog.xyz\/wp-json\/wp\/v2\/tags?post=2537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}