• springBoot集成SpringSecurity(随笔记录)


    • 在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。

    • 在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

    • 使用过滤器、拦截器也可以使用

    Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。

    “认证”(Authentication)

    身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。

    身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。

    “授权” (Authorization)

    授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。

    这个概念是通用的,而不是只在Spring Security 中存在。

    实现过程

    15.4 实现

    1、引入 Spring Security 依赖

    1. org.apache.shiro
    2. shiro-spring-boot-starter
    3. 1.10.1
    4. org.thymeleaf
    5. thymeleaf-spring5
    6. org.thymeleaf.extras
    7. thymeleaf-extras-java8time

    2、编写 Spring Security 配置类SecurityConfig

    1. package com.studyspringboot.study.config.security;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    5. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    6. import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
    7. import org.springframework.security.core.userdetails.User;
    8. import org.springframework.security.core.userdetails.UserDetails;
    9. import org.springframework.security.core.userdetails.UserDetailsService;
    10. import org.springframework.security.crypto.factory.PasswordEncoderFactories;
    11. import org.springframework.security.crypto.password.PasswordEncoder;
    12. import org.springframework.security.provisioning.InMemoryUserDetailsManager;
    13. import org.springframework.security.web.SecurityFilterChain;
    14. @Configuration
    15. @EnableWebSecurity
    16. public class SecurityConfig {
    17. @Bean
    18. public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    19. //首页所有人可以访问
    20. http.authorizeRequests(authorize -> authorize
    21. .antMatchers("/index").permitAll()
    22. .antMatchers("/").anonymous()
    23. .antMatchers("/level1/**").hasRole("vip1")
    24. .antMatchers("/level2/**").hasRole("vip2")
    25. .antMatchers("/level3/**").hasRole("vip3"))
    26. //没有权限跳转登录页
    27. .formLogin(login -> login
    28. .permitAll()
    29. .loginPage("/toLogin")
    30. .usernameParameter("username")
    31. .passwordParameter("password")
    32. .loginProcessingUrl("/user/login")// 登陆表单提交请求
    33. )
    34. .logout(l -> l.logoutSuccessUrl("/index").deleteCookies())// 注销成功来到首页
    35. .csrf(AbstractHttpConfigurer::disable)//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求
    36. .rememberMe(r -> r.rememberMeParameter("remember"))记住我 Cookies
    37. ;
    38. return http.build();
    39. }
    40. //定义认证规则
    41. @Bean
    42. public UserDetailsService users() {
    43. User.UserBuilder users = User.builder();
    44. PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
    45. //{noop}明文密码
    46. UserDetails w1 = User.withUsername("wyh").password("{noop}123456").roles("vip1").build();
    47. UserDetails admin =
    48. users.username("admin").password(encoder.encode("123456")).roles("vip1", "vip2", "vip3").build();
    49. return new InMemoryUserDetailsManager(w1, admin);
    50. }
    51. }

     3、配置前端权限

    1. <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
    2. <div class="bodyBox">
    3. <p sec:authorize="isAuthenticated()"><a th:href="@{/logout}" class="label label-warning"
    4. style="border-radius: .25em;">注销a>p>
    5. <p sec:authorize="!isAuthenticated()"><a th:href="@{/toLogin}" class="label label-success"
    6. style="border-radius: .25em;">登录a>p>
    7. 用户名:<span sec:authentication="principal.username">span>
    8. 角色:<span sec:authentication="principal.authorities">span>
    9. <div class="cardBox" sec:authorize="isAuthenticated() and hasRole('vip1')">
    10. <div class="bodyBox">
    11. <p><a th:href="@{/level1/1}" class="label label-info" style="border-radius: .25em;">level1-1a>p>
    12. <p><a th:href="@{/level1/2}" class="label label-info" style="border-radius: .25em;">level1-2a>p>
    13. <p><a th:href="@{/level1/3}" class="label label-info" style="border-radius: .25em;">level1-3a>p>
    14. div>
    15. div>
    16. div>

  • 相关阅读:
    MySQL索引分类及相关概念辨析
    人工智能训练师
    顺序表基本操作-查找
    @Binds methods must be abstract 报错指南
    WPF中创建柱状图(数据统计)
    React 自定义hook 之 防抖和节流
    命令执行漏洞【2】vulhub远程命令执行漏洞复现
    ROS1云课→19仿真turtlebot(stage)
    kubernetes Cluster Overiview
    Jvm-Sandbox-Repeater架构
  • 原文地址:https://blog.csdn.net/qq_35106903/article/details/127999258