{"id":40449,"date":"2023-10-08T00:19:41","date_gmt":"2024-01-13T22:08:03","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/"},"modified":"2024-05-04T03:17:39","modified_gmt":"2024-05-03T19:17:39","slug":"%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/","title":{"rendered":"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1"},"content":{"rendered":"<h2>\u9996\u5148<\/h2>\n<p>\u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u4f7f\u7528 Spring Security \u8fdb\u884c\u7528\u6237\u8ba4\u8bc1\u7684\u5e16\u5b50\u3002<\/p>\n<p>\u7531\u4e8eSpring Boot\u548cSpring Security\u7684\u7248\u672c\u5347\u7ea7\uff0c\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u56e0\u6b64\u5df2\u4e8e2019\u5e7410\u670814\u65e5\u8fdb\u884c\u4e86\u91cd\u5199\u3002<\/p>\n<h2>1. \u5f00\u53d1\u73af\u5883<\/h2>\n<div>\n<div class=\"post-table\">\u9805\u76ee\u540d\u5024OSWindows 10 HomejdkAdoptOpenJDKjava1.8gradle5.5.1IDEIntelliJ IDEA 2019.2.3(Community Edition)<\/div>\n<\/div>\n<h2>2. \u5236\u4f5c\u9879\u76ee\u6a21\u677f<\/h2>\n<h3>(1) \u521b\u5efa\u548c\u4e0b\u8f7d\u6a21\u677f<\/h3>\n<p>\u5728Spring Initializr\u4e2d\u521b\u5efa\u6a21\u677f\u3002\u6839\u636e\u94fe\u63a5\u9875\u9762\uff0c\u6309\u7167\u4ee5\u4e0b\u8868\u683c\u9009\u62e9\uff0c\u7136\u540e\u70b9\u51fb&#8221;Generate &#8211; Ctrl + \u23ce&#8221;\u6309\u94ae\u8fdb\u884c\u4e0b\u8f7d\u3002<\/p>\n<div>\n<div class=\"post-table\">\u9805\u76ee\u540d\u5024ProjectMaven ProjectLanguageJavaSpring Boot(SNAPSHOT)2.1.9Developer ToolsSpring Boot DevTools, LombokwebSpring WebTemplate EnginesThymeleafSecuritySpring SecuritySQLSpring Data JPA, PostgreSQL Driver<\/div>\n<\/div>\n<h3>\u5c06(2)\u5bfc\u5165\u5230IDE\u4e2d\u3002<\/h3>\n<p>\u4e0b\u8f7d\u6587\u4ef6\u540e\uff0c\u5c06\u5176\u89e3\u538b\u5230\u4e00\u4e2a\u9002\u5f53\u7684\u6587\u4ef6\u5939\u4e2d\u3002\u7136\u540e\uff0c\u6253\u5f00IntelliJ\uff0c\u9009\u62e9&#8221;\u6587\u4ef6&#8221;-&gt;&#8221;\u6253\u5f00&#8221;\uff0c\u7136\u540e\u6307\u5b9a\u89e3\u538b\u7684\u6587\u4ef6\u5939\u5373\u53ef\u3002<\/p>\n<h2>3. \u9879\u76ee\u6587\u4ef6\u5939\u548c\u6587\u4ef6\u7ed3\u6784<\/h2>\n<pre class=\"post-pre\"><code>  spring-security\r\n    \u2502  build.gradle\r\n    \u2514\u2500src\r\n        \u251c\u2500main\r\n        \u2502  \u251c\u2500java\r\n        \u2502  \u2502  \u2514\u2500com\r\n        \u2502  \u2502      \u2514\u2500example\r\n        \u2502  \u2502          \u2514\u2500security\r\n        \u2502  \u2502              \u2514\u2500springsecurity\r\n        \u2502  \u2502                  \u2502  ServletInitializer.java\r\n        \u2502  \u2502                  \u2502  SpringsecurityApplication.java\r\n        \u2502  \u2502                  \u2502  WebSecurityConfig.java\r\n        \u2502  \u2502                  \u2502  \r\n        \u2502  \u2502                  \u2514\u2500account\r\n        \u2502  \u2502                         Account.java\r\n        \u2502  \u2502                         AccountRepository.java\r\n        \u2502  \u2502                         AccountService.java\r\n        \u2502  \u2502                         AuthController.java\r\n        \u2502  \u2502                         \r\n        \u2502  \u2514\u2500resources\r\n        \u2502      \u2502  application.properties\r\n        \u2502      \u2502  hibernate.properties\r\n        \u2502      \u2502  \r\n        \u2502      \u251c\u2500static\r\n        \u2502      \u2514\u2500templates\r\n        \u2502              login.html\r\n        \u2502              top.html\r\n\u30fb\u30fb\u30fb\uff08\u4ee5\u4e0b\u3001\u7701\u7565\uff09\r\n<\/code><\/pre>\n<h2>4. \u6784\u5efa.gradle<\/h2>\n<p>\u53ea\u53d1\u5e03\u4f9d\u8d56\u9879<\/p>\n<pre class=\"post-pre\"><code>dependencies {\r\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\r\n    implementation 'org.springframework.boot:spring-boot-starter-security'\r\n    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'\r\n    implementation 'org.springframework.boot:spring-boot-starter-web'\r\n    compile('org.springframework.security:spring-security-web')\r\n    compile('org.springframework.security:spring-security-config')\r\n    compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity5')\r\n    compileOnly 'org.projectlombok:lombok'\r\n    developmentOnly 'org.springframework.boot:spring-boot-devtools'\r\n    runtimeOnly 'org.postgresql:postgresql'\r\n    annotationProcessor 'org.projectlombok:lombok'\r\n    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'\r\n    testImplementation 'org.springframework.boot:spring-boot-starter-test'\r\n    testImplementation 'org.springframework.security:spring-security-test'\r\n}\r\n<\/code><\/pre>\n<h2>5. Java &#8211; Java\u6280\u672f<\/h2>\n<p>\u6211\u5728\u6240\u505a\u7684\u66f4\u6539\u5904\u7559\u4e0b\u4e86\u8bc4\u8bba\u3002<\/p>\n<h3>(1) \u5b9e\u4f53<\/h3>\n<pre class=\"post-pre\"><code>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Collection<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Date<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.EnumSet<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Set<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">javax.persistence.*<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.core.GrantedAuthority<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.core.authority.SimpleGrantedAuthority<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.core.userdetails.UserDetails<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Entity<\/span>\r\n<span class=\"nd\">@Table<\/span><span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">\"accounts\"<\/span><span class=\"o\">)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Account<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">UserDetails<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">long<\/span> <span class=\"n\">serialVersionUID<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1L<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u6a29\u9650\u306f\u4e00\u822c\u30e6\u30fc\u30b6\u3001\u30de\u30cd\u30fc\u30b8\u30e3\u3001\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005\u306e\uff13\u7a2e\u985e\u3068\u3059\u308b<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">enum<\/span> <span class=\"nc\">Authority<\/span> <span class=\"o\">{<\/span><span class=\"no\">ROLE_USER<\/span><span class=\"o\">,<\/span><span class=\"no\">ROLE_MANAGER<\/span><span class=\"o\">,<\/span> <span class=\"no\">ROLE_ADMIN<\/span><span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Id<\/span>\r\n    <span class=\"nd\">@Column<\/span><span class=\"o\">(<\/span><span class=\"n\">nullable<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">,<\/span> <span class=\"n\">unique<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Column<\/span><span class=\"o\">(<\/span><span class=\"n\">nullable<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">password<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Column<\/span><span class=\"o\">(<\/span><span class=\"n\">nullable<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">,<\/span> <span class=\"n\">unique<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Column<\/span><span class=\"o\">(<\/span><span class=\"n\">nullable<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">mailAddressVerified<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Column<\/span><span class=\"o\">(<\/span><span class=\"n\">nullable<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"n\">enabled<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Temporal<\/span><span class=\"o\">(<\/span><span class=\"nc\">TemporalType<\/span><span class=\"o\">.<\/span><span class=\"na\">TIMESTAMP<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Date<\/span> <span class=\"n\">createdAt<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"c1\">\/\/ role\u306f\u8907\u6570\u7ba1\u7406\u3067\u304d\u308b\u3088\u3046\u306b\u3001Set&lt;&gt;\u3067\u5b9a\u7fa9\u3002<\/span>\r\n    <span class=\"nd\">@ElementCollection<\/span><span class=\"o\">(<\/span><span class=\"n\">fetch<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">FetchType<\/span><span class=\"o\">.<\/span><span class=\"na\">EAGER<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nd\">@Enumerated<\/span><span class=\"o\">(<\/span><span class=\"nc\">EnumType<\/span><span class=\"o\">.<\/span><span class=\"na\">STRING<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nd\">@Column<\/span><span class=\"o\">(<\/span><span class=\"n\">nullable<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Set<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">authorities<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"c1\">\/\/ JPA requirement<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"nf\">Account<\/span><span class=\"o\">()<\/span> <span class=\"o\">{}<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Account<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">password<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">username<\/span> <span class=\"o\">=<\/span> <span class=\"n\">username<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">password<\/span> <span class=\"o\">=<\/span> <span class=\"n\">password<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">mailAddress<\/span> <span class=\"o\">=<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">mailAddressVerified<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">enabled<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">EnumSet<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_USER<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u767b\u9332\u6642\u306b\u3001\u65e5\u6642\u3092\u81ea\u52d5\u30bb\u30c3\u30c8\u3059\u308b<\/span>\r\n    <span class=\"nd\">@PrePersist<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">prePersist<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">createdAt<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Date<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/admin\u6a29\u9650\u30c1\u30a7\u30c3\u30af<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isAdmin<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">contains<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_ADMIN<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/admin\u6a29\u9650\u30bb\u30c3\u30c8<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setAdmin<\/span><span class=\"o\">(<\/span><span class=\"kt\">boolean<\/span> <span class=\"n\">isAdmin<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">isAdmin<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_MANAGER<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_ADMIN<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">remove<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_ADMIN<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u7ba1\u7406\u8005\u6a29\u9650\u3092\u4fdd\u6709\u3057\u3066\u3044\u308b\u304b\uff1f<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isManager<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">contains<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_MANAGER<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u7ba1\u7406\u8005\u6a29\u9650\u30bb\u30c3\u30c8<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setManager<\/span><span class=\"o\">(<\/span><span class=\"kt\">boolean<\/span> <span class=\"n\">isManager<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">isManager<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_MANAGER<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">remove<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_MANAGER<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">remove<\/span><span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span><span class=\"o\">.<\/span><span class=\"na\">ROLE_ADMIN<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Collection<\/span><span class=\"o\">&lt;?<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">GrantedAuthority<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getAuthorities<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">GrantedAuthority<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">authorities<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ArrayList<\/span><span class=\"o\">&lt;&gt;();<\/span>\r\n        <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"nc\">Authority<\/span> <span class=\"n\">authority<\/span> <span class=\"o\">:<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">authorities<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"n\">authorities<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">SimpleGrantedAuthority<\/span><span class=\"o\">(<\/span><span class=\"n\">authority<\/span><span class=\"o\">.<\/span><span class=\"na\">toString<\/span><span class=\"o\">()));<\/span>\r\n        <span class=\"o\">}<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">authorities<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isAccountNonExpired<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isAccountNonLocked<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isCredentialsNonExpired<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">getUsername<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">username<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setUsername<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">username<\/span> <span class=\"o\">=<\/span> <span class=\"n\">username<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">getPassword<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">password<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setPassword<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">password<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">password<\/span> <span class=\"o\">=<\/span> <span class=\"n\">password<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isEnabled<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">enabled<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setEnabled<\/span><span class=\"o\">(<\/span><span class=\"kt\">boolean<\/span> <span class=\"n\">enabled<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">enabled<\/span> <span class=\"o\">=<\/span> <span class=\"n\">enabled<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">getMailAddress<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setMailAddress<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">mailAddress<\/span> <span class=\"o\">=<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isMailAddressVerified<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">mailAddressVerified<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setMailAddressVerified<\/span><span class=\"o\">(<\/span><span class=\"kt\">boolean<\/span> <span class=\"n\">mailAddressVerified<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">mailAddressVerified<\/span> <span class=\"o\">=<\/span> <span class=\"n\">mailAddressVerified<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Date<\/span> <span class=\"nf\">getCreatedAt<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">createdAt<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>(2) \u5b58\u50a8\u5e93<\/h3>\n<pre class=\"post-pre\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.data.repository.CrudRepository<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.stereotype.Repository<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Repository<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">AccountRepository<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">CrudRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Account<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Long<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Account<\/span> <span class=\"nf\">findByUsername<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>(3) \u670d\u52a1<\/h3>\n<pre class=\"post-pre\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.beans.factory.annotation.Autowired<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.core.userdetails.UserDetailsService<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.core.userdetails.UsernameNotFoundException<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.crypto.password.PasswordEncoder<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.stereotype.Service<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.transaction.annotation.Transactional<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Service<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AccountService<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">UserDetailsService<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">AccountRepository<\/span> <span class=\"n\">repository<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">PasswordEncoder<\/span> <span class=\"n\">passwordEncoder<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Account<\/span> <span class=\"nf\">loadUserByUsername<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">UsernameNotFoundException<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">username<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">||<\/span> <span class=\"s\">\"\"<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">UsernameNotFoundException<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Username is empty\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n        <span class=\"nc\">Account<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"na\">findByUsername<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">user<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">UsernameNotFoundException<\/span><span class=\"o\">(<\/span><span class=\"s\">\"User not found: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">username<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n        <span class=\"k\">return<\/span> <span class=\"n\">user<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/admin\u3092\u767b\u9332\u3059\u308b\u30e1\u30bd\u30c3\u30c9<\/span>\r\n    <span class=\"nd\">@Transactional<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">registerAdmin<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">password<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">Account<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Account<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"n\">passwordEncoder<\/span><span class=\"o\">.<\/span><span class=\"na\">encode<\/span><span class=\"o\">(<\/span><span class=\"n\">password<\/span><span class=\"o\">),<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">setAdmin<\/span><span class=\"o\">(<\/span><span class=\"kc\">true<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"na\">save<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u7ba1\u7406\u8005\u3092\u767b\u9332\u3059\u308b\u30e1\u30bd\u30c3\u30c9<\/span>\r\n    <span class=\"nd\">@Transactional<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">registerManager<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">password<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">Account<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Account<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"n\">passwordEncoder<\/span><span class=\"o\">.<\/span><span class=\"na\">encode<\/span><span class=\"o\">(<\/span><span class=\"n\">password<\/span><span class=\"o\">),<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">user<\/span><span class=\"o\">.<\/span><span class=\"na\">setManager<\/span><span class=\"o\">(<\/span><span class=\"kc\">true<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"na\">save<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u4e00\u822c\u30e6\u30fc\u30b6\u3092\u767b\u9332\u3059\u308b\u30e1\u30bd\u30c3\u30c9<\/span>\r\n    <span class=\"nd\">@Transactional<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">registerUser<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">password<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">Account<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Account<\/span><span class=\"o\">(<\/span><span class=\"n\">username<\/span><span class=\"o\">,<\/span> <span class=\"n\">passwordEncoder<\/span><span class=\"o\">.<\/span><span class=\"na\">encode<\/span><span class=\"o\">(<\/span><span class=\"n\">password<\/span><span class=\"o\">),<\/span> <span class=\"n\">mailAddress<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"na\">save<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>(4) \u63a7\u5236\u5668<\/h3>\n<pre class=\"post-pre\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.beans.factory.annotation.Autowired<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.stereotype.Controller<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.ui.Model<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.GetMapping<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.PostMapping<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RequestMapping<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Controller<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AuthController<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"redirect:\/top\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">login<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"login\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@PostMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">loginPost<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"redirect:\/login-error\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login-error\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">loginError<\/span><span class=\"o\">(<\/span><span class=\"nc\">Model<\/span> <span class=\"n\">model<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"na\">addAttribute<\/span><span class=\"o\">(<\/span><span class=\"s\">\"loginError\"<\/span><span class=\"o\">,<\/span> <span class=\"kc\">true<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"login\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/top\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">top<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"\/top\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\uff085\uff09\u5b89\u5168\u914d\u7f6e<\/h3>\n<pre class=\"post-pre\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">com.example.security.springsecurity.account.AccountService<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.beans.factory.annotation.Autowired<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Bean<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.builders.HttpSecurity<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.configuration.EnableWebSecurity<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.crypto.password.PasswordEncoder<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@EnableWebSecurity<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">WebSecurityConfig<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">WebSecurityConfigurerAdapter<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">AccountService<\/span> <span class=\"n\">userService<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">configure<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpSecurity<\/span> <span class=\"n\">http<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"c1\">\/\/TODO: \u6700\u4f4e\u9650\u306e\u5b9f\u88c5\u3002css\u306a\u3069\u306estatic\u30d5\u30a1\u30a4\u30eb\u306a\u3069\u306e\u8a31\u53ef\u3092\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u3042\u308a\u307e\u3059\u3002<\/span>\r\n        <span class=\"n\">http<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">authorizeRequests<\/span><span class=\"o\">()<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">antMatchers<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\/login-error\"<\/span><span class=\"o\">).<\/span><span class=\"na\">permitAll<\/span><span class=\"o\">()<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">antMatchers<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/**\"<\/span><span class=\"o\">).<\/span><span class=\"na\">hasRole<\/span><span class=\"o\">(<\/span><span class=\"s\">\"USER\"<\/span><span class=\"o\">)<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">and<\/span><span class=\"o\">()<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">formLogin<\/span><span class=\"o\">()<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">loginPage<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"o\">).<\/span><span class=\"na\">failureUrl<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login-error\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n\r\n    <span class=\"c1\">\/\/\u5909\u66f4\u70b9 \u30ed\u30fc\u30c9\u6642\u306b\u3001\u300cadmin\u300d\u30e6\u30fc\u30b6\u3092\u767b\u9332\u3059\u308b\u3002<\/span>\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">configure<\/span><span class=\"o\">(<\/span><span class=\"nc\">AuthenticationManagerBuilder<\/span> <span class=\"n\">auth<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">auth<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">userDetailsService<\/span><span class=\"o\">(<\/span><span class=\"n\">userService<\/span><span class=\"o\">)<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">passwordEncoder<\/span><span class=\"o\">(<\/span><span class=\"n\">passwordEncoder<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"c1\">\/\/TODO: property\u3067admin\u60c5\u5831\u306f\u7ba1\u7406\u3057\u307e\u3057\u3087\u3046\u3002<\/span>\r\n        <span class=\"n\">userService<\/span><span class=\"o\">.<\/span><span class=\"na\">registerAdmin<\/span><span class=\"o\">(<\/span><span class=\"s\">\"admin\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"secret\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"admin@localhost\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"c1\">\/\/\u5909\u66f4\u70b9 PasswordEncoder(BCryptPasswordEncoder)\u30e1\u30bd\u30c3\u30c9<\/span>\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">PasswordEncoder<\/span> <span class=\"nf\">passwordEncoder<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"c1\">\/\/<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">BCryptPasswordEncoder<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>6. \u8d44\u6e90 (z\u012b<\/h2>\n<h3>(1) \u767b\u5f55\u9875.html y\u00e8.html)<\/h3>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\r\n<span class=\"nt\">&lt;html<\/span> <span class=\"na\">xmlns:th=<\/span><span class=\"s\">\"http:\/\/www.thymeleaf.org\"<\/span><span class=\"nt\">&gt;<\/span>\r\n<span class=\"nt\">&lt;head&gt;<\/span>\r\n    <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">charset=<\/span><span class=\"s\">\"utf-8\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;title&gt;<\/span>Login page<span class=\"nt\">&lt;\/title&gt;<\/span>\r\n    <span class=\"nt\">&lt;style&gt;<\/span>\r\n<span class=\"nc\">.alert-danger<\/span><span class=\"p\">{<\/span><span class=\"nl\">color<\/span><span class=\"p\">:<\/span><span class=\"no\">red<\/span><span class=\"p\">;}<\/span>\r\n<span class=\"nt\">&lt;\/style&gt;<\/span>\r\n<span class=\"nt\">&lt;\/head&gt;<\/span>\r\n<span class=\"nt\">&lt;body&gt;<\/span>\r\n<span class=\"nt\">&lt;h2&gt;<\/span>\u30ed\u30b0\u30a4\u30f3\u753b\u9762<span class=\"nt\">&lt;\/h2&gt;<\/span>\r\n<span class=\"nt\">&lt;form<\/span> <span class=\"na\">th:action=<\/span><span class=\"s\">\"@{\/login}\"<\/span> <span class=\"na\">method=<\/span><span class=\"s\">\"post\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;div<\/span> <span class=\"na\">th:if=<\/span><span class=\"s\">\"${session['SPRING_SECURITY_LAST_EXCEPTION']} != null\"<\/span>\r\n         <span class=\"na\">class=<\/span><span class=\"s\">\"alert-danger\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;span<\/span> <span class=\"na\">th:text=<\/span><span class=\"s\">\"\u30e6\u30fc\u30b6\u540d\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u306b\u8aa4\u308a\u304c\u3042\u308a\u307e\u3059\"<\/span><span class=\"nt\">&gt;&lt;\/span&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/div&gt;<\/span>\r\n    <span class=\"nt\">&lt;div<\/span> <span class=\"na\">style=<\/span><span class=\"s\">\"width:160px;\"<\/span><span class=\"nt\">&gt;&lt;label<\/span> <span class=\"na\">for=<\/span><span class=\"s\">\"username\"<\/span><span class=\"nt\">&gt;<\/span>\u30e6\u30fc\u30b6\u540d\uff1a<span class=\"nt\">&lt;\/label&gt;&lt;\/div&gt;<\/span>\r\n    <span class=\"nt\">&lt;input<\/span> <span class=\"na\">type=<\/span><span class=\"s\">\"text\"<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"username\"<\/span> <span class=\"na\">autofocus=<\/span><span class=\"s\">\"autofocus\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;br\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;div<\/span> <span class=\"na\">style=<\/span><span class=\"s\">\"width:160px;\"<\/span><span class=\"nt\">&gt;&lt;label<\/span> <span class=\"na\">for=<\/span><span class=\"s\">\"password\"<\/span><span class=\"nt\">&gt;<\/span>\u30d1\u30b9\u30ef\u30fc\u30c9\uff1a<span class=\"nt\">&lt;\/label&gt;&lt;\/div&gt;<\/span>\r\n    <span class=\"nt\">&lt;input<\/span> <span class=\"na\">type=<\/span><span class=\"s\">\"password\"<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"password\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;br\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;p&gt;&lt;input<\/span> <span class=\"na\">type=<\/span><span class=\"s\">\"submit\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"\u30ed\u30b0\u30a4\u30f3\"<\/span> <span class=\"nt\">\/&gt;&lt;\/p&gt;<\/span>\r\n<span class=\"nt\">&lt;\/form&gt;<\/span>\r\n<span class=\"nt\">&lt;\/body&gt;<\/span>\r\n<span class=\"nt\">&lt;\/html&gt;<\/span>\r\n<\/code><\/pre>\n<h3>(2) \u9996\u9875.html .html)<\/h3>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\r\n<span class=\"nt\">&lt;html<\/span> <span class=\"na\">xmlns:th=<\/span><span class=\"s\">\"http:\/\/www.thymeleaf.org\"<\/span>\r\n      <span class=\"na\">xmlns:sec=<\/span><span class=\"s\">\"http:\/\/www.thymeleaf.org\/thymeleaf-extras-springsecurity5\"<\/span><span class=\"nt\">&gt;<\/span>\r\n<span class=\"nt\">&lt;head&gt;<\/span>\r\n    <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">charset=<\/span><span class=\"s\">\"UTF-8\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;title&gt;<\/span>\u30e1\u30cb\u30e5\u30fc\u753b\u9762<span class=\"nt\">&lt;\/title&gt;<\/span>\r\n<span class=\"nt\">&lt;\/head&gt;<\/span>\r\n<span class=\"nt\">&lt;body&gt;<\/span>\r\n<span class=\"nt\">&lt;h2&gt;<\/span>\u3053\u3093\u306b\u3061\u306f<span class=\"nt\">&lt;\/h2&gt;<\/span>\r\n<span class=\"nt\">&lt;div<\/span> <span class=\"na\">th:fragment=<\/span><span class=\"s\">\"logout\"<\/span> <span class=\"na\">sec:authorize=<\/span><span class=\"s\">\"isAuthenticated()\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;p&gt;<\/span>\u3053\u3093\u306b\u3061\u306f:\r\n        <span class=\"nt\">&lt;span<\/span> <span class=\"na\">sec:authentication=<\/span><span class=\"s\">\"name\"<\/span><span class=\"nt\">&gt;&lt;\/span&gt;<\/span>\u3055\u3093<span class=\"nt\">&lt;\/p&gt;<\/span>\r\n    <span class=\"nt\">&lt;p&gt;<\/span>mail:\r\n        <span class=\"nt\">&lt;span<\/span> <span class=\"na\">sec:authentication=<\/span><span class=\"s\">\"principal.mailAddress\"<\/span><span class=\"nt\">&gt;&lt;\/span&gt;&lt;\/p&gt;<\/span>\r\n    <span class=\"nt\">&lt;p&gt;<\/span>\u6a29\u9650:\r\n        <span class=\"nt\">&lt;span<\/span> <span class=\"na\">sec:authentication=<\/span><span class=\"s\">\"principal.authorities\"<\/span><span class=\"nt\">&gt;&lt;\/span&gt;&lt;\/p&gt;<\/span>\r\n    <span class=\"nt\">&lt;form<\/span> <span class=\"na\">action=<\/span><span class=\"s\">\"#\"<\/span> <span class=\"na\">th:action=<\/span><span class=\"s\">\"@{\/logout}\"<\/span> <span class=\"na\">method=<\/span><span class=\"s\">\"post\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;input<\/span> <span class=\"na\">type=<\/span><span class=\"s\">\"submit\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"\u30ed\u30b0\u30a2\u30a6\u30c8\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/form&gt;<\/span>\r\n<span class=\"nt\">&lt;\/div&gt;<\/span>\r\n<span class=\"nt\">&lt;\/body&gt;<\/span>\r\n<span class=\"nt\">&lt;\/html&gt;<\/span>\r\n<\/code><\/pre>\n<h3>(3) \u5e94\u7528\u7a0b\u5e8f\u914d\u7f6e\u6587\u4ef6.properties<\/h3>\n<pre class=\"post-pre\"><code><span class=\"py\">spring.datasource.driverClassName<\/span><span class=\"p\">=<\/span><span class=\"s\">org.postgresql.Driver<\/span>\r\n<span class=\"py\">spring.datasource.url<\/span><span class=\"p\">=<\/span><span class=\"s\">jdbc:postgresql:\/\/localhost:5432\/sampledb<\/span>\r\n<span class=\"py\">spring.datasource.username<\/span><span class=\"p\">=<\/span><span class=\"s\">testuser<\/span>\r\n<span class=\"py\">spring.datasource.password<\/span><span class=\"p\">=<\/span><span class=\"s\">secret<\/span>\r\n<span class=\"py\">spring.jpa.hibernate.ddl-auto<\/span><span class=\"p\">=<\/span><span class=\"s\">update<\/span>\r\n<span class=\"py\">spring.jpa.properties.hibernate.format_sql<\/span><span class=\"p\">=<\/span><span class=\"s\">true<\/span>\r\n<span class=\"py\">logging.level.org.hibernate.SQL<\/span><span class=\"p\">=<\/span><span class=\"s\">DEBUG<\/span>\r\n<span class=\"py\">logging.level.org.hibernate.type.descriptor.sql.BasicBinder<\/span><span class=\"p\">=<\/span><span class=\"s\">TRACE<\/span>\r\n<\/code><\/pre>\n<h3>(4) hibernate.properties<br \/>\n\uff084\uff09hibernate.properties\u6587\u4ef6<\/h3>\n<p>\u5982\u679c\u8981\u8fde\u63a5\u5230PostgreSQL\uff0c\u8bf7\u5728\u6b64\u914d\u7f6e\u6587\u4ef6\u4e2d\u8fdb\u884c\u8ffd\u52a0\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"py\">hibernate.jdbc.lob.non_contextual_creation<\/span> <span class=\"p\">=<\/span> <span class=\"s\">true<\/span>\r\n<\/code><\/pre>\n<h2>7. \u68c0\u67e5\u884c\u52a8\u662f\u5426\u6b63\u5e38<\/h2>\n<h3>(1) \u8fd0\u884c Spring Boot<\/h3>\n<p>\u5728IntelliJ\u4e2d\u9009\u62e9\u300cView\u300d\u2192\u300cTool Windows\u300d\u2192\u300cGradle\u300d\uff0c\u7136\u540e\u6253\u5f00\u300cGradle\u300d\u7a97\u53e3\u3002<br \/>\n\u5728\u300cGradle\u300d\u7a97\u53e3\u4e2d\u9009\u62e9\u300cTasks\u300d\u2192\u300capplication\u300d\uff0c\u7136\u540e\u53cc\u51fb\u300cbootRun\u300d\u3002<\/p>\n<h3>(2) \u884c\u52a8\u786e\u8ba4<\/h3>\n<p>\u8bbf\u95eehttp:\/\/localhost:8080\u3002\u767b\u5f55\u9875\u9762\u5c06\u663e\u793a\u5982\u4e0b\uff0c\u5e76\u5728\u8ba4\u8bc1\u540e\u663e\u793a\u9996\u9875\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403f37434c4406c913bd\/43-0.png\" alt=\"image.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403f37434c4406c913bd\/44-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u53c2\u8003\u7f51\u7ad9\uff1a<br \/>\n\u300a\u7c89\u7ea2\u6280\u672f\u300b\u5c1d\u8bd5\u4f7f\u7528Spring Security\u5b9e\u65bd\u7528\u6237\u8ba4\u8bc1<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u4f7f\u7528 Spring Security \u8fdb\u884c\u7528\u6237\u8ba4\u8bc1\u7684\u5e16\u5b50\u3002 \u7531\u4e8eSpring Boot\u548cSp [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40449","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot-spring-security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u4f7f\u7528 Spring Security \u8fdb\u884c\u7528\u6237\u8ba4\u8bc1\u7684\u5e16\u5b50\u3002 \u7531\u4e8eSpring Boot\u548cSp [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot-spring-security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-13T22:08:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-03T19:17:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403f37434c4406c913bd\/43-0.png\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/\",\"name\":\"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-01-13T22:08:03+00:00\",\"dateModified\":\"2024-05-03T19:17:39+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot-spring-security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1","og_description":"\u9996\u5148 \u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u4f7f\u7528 Spring Security \u8fdb\u884c\u7528\u6237\u8ba4\u8bc1\u7684\u5e16\u5b50\u3002 \u7531\u4e8eSpring Boot\u548cSp [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot-spring-security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-01-13T22:08:03+00:00","article_modified_time":"2024-05-03T19:17:39+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403f37434c4406c913bd\/43-0.png"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/","name":"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-01-13T22:08:03+00:00","dateModified":"2024-05-03T19:17:39+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528SpringBoot + Spring Security\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot-spring-security%e8%bf%9b%e8%a1%8c%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40449"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40449\/revisions"}],"predecessor-version":[{"id":95791,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40449\/revisions\/95791"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}