• Spring Boot、Spring Security登录认证及权限问题



    目录

    一、登录验证

    1.自定义密码账号

    Ⅰ.引入依赖

    Ⅱ. XxxApplication启动类

    Ⅲ. 在application.yml文件中自定义

    Ⅳ.启动项目

    2.从数据库中查找账号和密码 

    Ⅰ.引入依赖

    Ⅱ. application.yml文件

    Ⅲ. bean包的操作

    Ⅳ. service层

    Ⅴ.config配置类 

    Ⅵ.启动项目

    二、权限问题

    1.config类

    2.bean包

    3.service层

    4.启动项目


    一、登录验证

    1.自定义密码账号

    Ⅰ.引入依赖

    先搭建好一个SpringBoot框架,在基础上引入依赖

    1. <!--web-->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. <version>2.7.1</version>
    6. </dependency>
    7. <!--小辣椒-->
    8. <dependency>
    9. <groupId>org.projectlombok</groupId>
    10. <artifactId>lombok</artifactId>
    11. <version>1.18.24</version>
    12. </dependency>
    13. <!--spring security-->
    14. <dependency>
    15. <groupId>org.springframework.boot</groupId>
    16. <artifactId>spring-boot-starter-security</artifactId>
    17. </dependency>

    Ⅱ. XxxApplication启动类

    1. @SpringBootApplication
    2. public class DemoApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(DemoApplication.class,args);
    5. }
    6. }

    Ⅲ. 在application.yml文件中自定义

    1. spring:
    2. security:
    3. user:
    4. name: porsche
    5. password: 911

    Ⅳ.启动项目

    运行项目,在网页中输入账号密码。

    2.从数据库中查找账号和密码 

    Ⅰ.引入依赖

    1. <!--mysql连接-->
    2. <dependency>
    3. <groupId>mysql</groupId>
    4. <artifactId>mysql-connector-java</artifactId>
    5. </dependency>
    6. <!--mybatis plus-->
    7. <dependency>
    8. <groupId>com.baomidou</groupId>
    9. <artifactId>mybatis-plus-boot-starter</artifactId>
    10. <version>3.5.1</version>
    11. </dependency>
    12. <!--druid-->
    13. <dependency>
    14. <groupId>com.alibaba</groupId>
    15. <artifactId>druid-spring-boot-starter</artifactId>
    16. <version>1.2.9</version>
    17. </dependency>

    Ⅱ. application.yml文件

    1. server:
    2. port: 8080
    3. spring:
    4. datasource:
    5. driver-class-name: com.mysql.cj.jdbc.Driver
    6. username: bjwl
    7. password: bjwl
    8. url: jdbc:mysql://192.168.1.118:3306/book_store?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    9. type: com.alibaba.druid.pool.DruidDataSource
    10. mybatis-plus:
    11. configuration:
    12. map-underscore-to-camel-case: false
    13. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    Ⅲ. bean包的操作

    实体类:

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @TableName("user")
    5. public class Users implements Serializable {
    6. private Integer id;
    7. private String userName;
    8. private String passWord;
    9. private String nickName;
    10. private Integer state;
    11. }

    LoginUsers类:

    1. @AllArgsConstructor
    2. @NoArgsConstructor
    3. public class LoginUsers implements UserDetails {
    4. private Users users;
    5. //返回当前用户的所有权限
    6. public Collection<? extends GrantedAuthority> getAuthorities() {
    7. return users.getList();
    8. }
    9. //返回密码
    10. public String getPassword() {
    11. return users.getPassWord();
    12. }
    13. //返回用户名
    14. public String getUsername() {
    15. return users.getUserName();
    16. }
    17. @Override
    18. public boolean isAccountNonExpired() {
    19. return true;
    20. }
    21. @Override
    22. public boolean isAccountNonLocked() {
    23. return true;
    24. }
    25. @Override
    26. public boolean isCredentialsNonExpired() {
    27. return true;
    28. }
    29. @Override
    30. public boolean isEnabled() {
    31. return true;
    32. }
    33. }

    Ⅳ. service层

    1. // 是SpringSecurity的业务类,负责实现认证和授权
    2. @Service
    3. public class UsersService implements UserDetailsService {
    4. @Resource
    5. private UsersMapper mapper;
    6. @Override
    7. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    8. QueryWrapper<Users> wrapper = new QueryWrapper<>();
    9. wrapper.eq("username", username);
    10. Users users = mapper.selectOne(wrapper);//查询一条记录
    11. if (Objects.isNull(users)) {
    12. throw new RuntimeException("用户名没有找到");
    13. }
    14. return new LoginUsers(users);
    15. }
    16. }

    Ⅴ.config配置类 

    1. /*
    2. 它是SpringSecurity的配置类
    3. */
    4. @Configuration
    5. public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    6. @Resource
    7. private UsersService usersService;
    8. @Bean
    9. public PasswordEncoder getPasswordEncoder() {
    10. return new BCryptPasswordEncoder();
    11. }
    12. //数据库的认证
    13. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    14. auth.userDetailsService(usersService).passwordEncoder(getPasswordEncoder());
    15. }
    16. }

    Ⅵ.启动项目

     此时后台也会显示出,在数据库中查询了一次

    二、权限问题

    1.config类

    在类中设置权限,和设置权限名,给1.html只开启了abc01的权限,给2.html开启了abc01和abc02的权限。

    也就是说abc01可以访问1.html和2.html,abc02只可以访问2.html

    1. protected void configure(HttpSecurity http) throws Exception {
    2. http.formLogin()
    3. .loginPage("/login.html") //登录页面设置
    4. .loginProcessingUrl("/a/lo") //登录访问路径 这里同 login.html中的action
    5. .permitAll()
    6. .and().exceptionHandling().accessDeniedPage("/403.html")
    7. .and().authorizeRequests()
    8. .antMatchers("/login.html", "/a/lo").permitAll() //设置哪些路径可以直接访问,不需要认证
    9. .antMatchers("/1.html").hasAuthority("adc01") //设置当前网页访问权限
    10. .antMatchers("/2.html").hasAnyAuthority("abc01","abc02")
    11. .anyRequest().authenticated() //所有请求都可以访问
    12. .and().csrf().disable(); //关闭csrf,csrf:跨站请求伪造
    13. }

    2.bean包

    在实体类中加入

    1. @TableField(exist = false)
    2. private List<GrantedAuthority> list;

    3.service层

    为用户设置权限名

    1. List<GrantedAuthority> list = new ArrayList<>();
    2. list.add(new SimpleGrantedAuthority("abc02"));
    3. users.setList(list);

    4.启动项目

    登录

    访问1.html

    访问2.html

     


  • 相关阅读:
    金仓数据库 KingbaseES SQL 语言参考手册 (3.5. 格式模型、3.6. 空值、3.7. 注释)
    内存取证入门第二题
    [计算机入门] 设置日期和时间
    功能测试人员如何做到花一个月的时间进阶自动化软件测试工程师
    实现ESP8266模块的socket接口,以提供MQTTClient库底层数据收发接口
    docker 快速上手
    LeetCode每日一题——672. 灯泡开关 Ⅱ
    若依集成minio实现分布式文件存储
    Ai-WB2系列的固件烧录指导
    【1】c++11新特性(稳定性和兼容性)—>原始字面量
  • 原文地址:https://blog.csdn.net/weixin_55166132/article/details/125509739