当前位置: 首页 > article >正文

Springboot组合SpringSecurity安全插件基于密码的验证Demo

Springboot组合SpringSecurity安全插件基于密码的验证Demo!下面的案例,都是基于数据库mysql,用户密码,验证登录的策略demo。


1;引入maven仓库的坐标

<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2:增加配置类,配置基础的参数信息。

package com.example.guan.config;


import com.example.guan.service.security.CustomUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;


import javax.annotation.Resource;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启方法级安全验证
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Resource
    private CustomUserDetailsService iUserService;


    protected void configure(HttpSecurity http) throws Exception {

        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/get-user").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/user/showLogin")
                .defaultSuccessUrl("/index")
                .permitAll()
                .and()
                .logout()
                .permitAll();


    }
    @Autowired
    protected void configure(AuthenticationManagerBuilder  auth) throws Exception {
        //这里的参数类型,必须是符合插件本身的类型才行。必须是UserDetailsService的实现类才行。
        auth.userDetailsService(iUserService);
    }
}

声明:

WebSecurityConfigurerAdapter,这个有提示,说该抽象类已经被弃用。

3:需要创建一个实现了接口

UserDetailsService

的类(

CustomUserDetailsService

)类的名字你可以自己定义,但是必须实现这个插件的接口才行。

package com.example.guan.service.security;

import com.example.guan.bean.User;
import com.example.guan.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import org.apache.commons.codec.digest.DigestUtils;

import java.util.ArrayList;
import java.util.List;

@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private IUserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 通过用户名从数据库获取用户信息
        User user = userService.getOneByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在");
        }

        // 得到用户角色
        String role = user.getRoleinfo();

        // 角色集合
        List<GrantedAuthority> authorities = new ArrayList<>();
        // 角色必须以`ROLE_`开头,数据库中没有,则在这里加
        authorities.add(new SimpleGrantedAuthority("ROLE_" + role));

        return  new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),authorities);



    }
}

4:创建一个测试控制器HelloController.测试一下效果

package com.example.guan.controller;

import com.example.guan.bean.User;
import com.example.guan.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Autowired
    private IUserService userInfoService;

    @GetMapping("/get-user")
    public User getUser(@RequestParam String username){
        return userInfoService.getOneByUsername(username);
    }

    @PreAuthorize("hasAnyRole('user')") // 只能user角色才能访问该方法
    @GetMapping("/user")
    public String user(){
        return "user角色访问";
    }

    @PreAuthorize("hasAnyRole('admin')") // 只能admin角色才能访问该方法
    @GetMapping("/admin")
    public String admin(){
        return "admin角色访问";
    }

}

具体测试结果如下所示:

1:get-user接口的测试效果如下:

如图,这个接口需要带一个参数,username。我使用的是Apifox接口管理软件。


 


http://www.kler.cn/a/416710.html

相关文章:

  • 【Python网络爬虫笔记】6- 网络爬虫中的Requests库
  • PYTHON让大模型固定的返回JSON
  • Lodash的debounce方法:优化你的函数调用
  • C++设计模式(观察者模式)
  • 单细胞细胞通讯全流程分析教程,代做分析和辅导
  • 使用Native AOT发布C# dll 提供给C++调用
  • 目标检测,图像分割,超分辨率重建
  • 什么是Delta Lake(数据湖框架),以及Delta Lake特性和如何使用
  • 软路由设置ip地址实现一机一IP
  • JiaJia-CP-1,2,3的WP(2)
  • 【Redis初阶】Set 集合
  • Bert+CRF的NER实战
  • 七大基于比较的排序算法
  • C#中的工厂模式
  • GPT的自回归语言建模(Autoregressive Language Modeling)
  • auto与decltype
  • Python知识点精汇:列表篇精汇!
  • 泰州榉之乡全托机构探讨:自闭症孩子精细动作训练之法
  • C++设计模式(装饰模式)
  • Java中的运算符“instanceof“详解
  • pycharm链接neo4j数据库(简单)
  • 系统思考—结构影响行为
  • ubuntu24.04 python环境
  • jdk8没有InputStream.transferTo()
  • 鸿蒙千帆启新程,共绘数字生态蓝图
  • 腾讯阅文集团Android面试题及参考答案