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

news/2024/11/30 12:42:27/

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 {@Resourceprivate 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();}@Autowiredprotected 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 {@Autowiredprivate IUserService userService;@Overridepublic 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 {@Autowiredprivate 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.ppmy.cn/news/1551194.html

相关文章

com.alibaba.fastjson.JSONException: not close json text, token : error

今天遇到一个相当智障的问题&#xff0c;前端传参数到后端&#xff0c;后端直接报json解析错误&#xff0c;not close&#xff1f;&#xff1f; 听着就很奇怪&#xff0c;关键有的时候正常&#xff0c;有的时候不正常。于是先在浏览器中F12&#xff0c;看传的参数 感觉 没问题&…

vulnhub靶场之hackableⅢ

hackable3 前言 这里使用virtual box加载靶机 靶机&#xff1a;hackable3 攻击&#xff1a;kali 主机发现 使用arp-scan -l扫描 信息收集 使用nmap扫描 这里明显&#xff1a; 22端口ssh服务可能过滤了80端口开启apache的http服务 网站目录扫描 使用dirsearch扫描&…

渗透测试笔记—Windows基础和病毒制作

声明&#xff1a; 学习视频来自B站up主 【泷羽sec】有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&am…

数据采集中,除了IP池的IP被封,还有哪些常见问题?

在数据采集的过程中&#xff0c;代理IP池的使用无疑为我们打开了一扇通往信息宝库的大门。然而&#xff0c;除了IP被封禁这一常见问题外&#xff0c;还有许多其他问题可能影响数据采集的效果。本文将探讨在数据采集中&#xff0c;除了IP被封之外&#xff0c;还可能遇到的一些常…

深入探索Facebook的技术生态:社交网络背后的科技创新

Facebook&#xff08;现Meta&#xff09;作为全球领先的社交平台&#xff0c;其背后的技术生态是推动其不断创新与发展的关键。除了作为一个社交网络&#xff0c;Facebook通过深度融入人工智能、虚拟现实、增强现实等前沿技术&#xff0c;重塑了数字社交的未来。本文将简要探讨…

七天掌握SQL——第六天:数据库性能优化与监控

一、引言 在数据库管理系统中&#xff0c;性能优化与监控是确保数据库高效运行的关键环节。通过优化查询和索引&#xff0c;可以显著提升数据库的处理速度&#xff1b;而有效的监控技术则能帮助我们及时发现并解决潜在的性能问题。本文将详细介绍数据库性能优化的方法&#xf…

VC++网络安全编程范例(12)-PKI编程

PKI&#xff08;Public Key Infrastructure &#xff09; 即"公钥基础设施"&#xff0c;是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系&#xff0c;简单来说&#xff0c;PKI就是利用公钥理论和技…

C++算法练习-day45——236.二叉树的最近公共祖先

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 题目要求在一个二叉树中找到两个给定节点的最低公共祖先&#xff08;Lowest Common Ancestor, LCA&#xff09;。最低公共祖先是指在树中同时包含两个给定节点的所有节点中&#xff0c;深度最大的…