第03讲:Security之用户鉴权

news2025/1/18 8:38:48

一、创建项目

参考:浅试Security

二、实现用户鉴权

        何为鉴权?说白了其实就是用户认证,用户输入用户名和密码,只有认证通过了才能使用我的系统。
        在实际的项目开发中,账号和密码都是从数据库中查询出来的。所以,我们可以通过自定义逻辑来控制认证。在Security中,如果需要自定义用户认证逻辑(鉴权),只需要实现UserDetailsService接口即可。

2.1、鉴权服务类SecurityService

package demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

/**
 * 自定义鉴权服务类
 */
@Service
public class SecurityService implements UserDetailsService {

    @Autowired
    @Lazy
    private  PasswordEncoder encoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //根据username,去数据库查该用户的信息
        System.out.println("************");
        System.out.println(username);
        if("tom".equals(username)){
            return new User("tom", encoder.encode("123"), AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
        } else {
            throw new UsernameNotFoundException("用户名或密码错误");
        }
    }
}

Tip:实际开发中,我们一般会通过数据库来认证用户信息,大概实现思路是在自定义UserDetailsService类中的loadUserByUsername方法中根据用户名去数据库中查询用户信息,如果满足要求,则用户通过认证,如果不满足要求,则抛出一个UsernameNotFoundException异常,该异常时SpringSecurity内部定义的用于抛出用户不存在的异常。

2.2、Security配置类SecurityConfig

package demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * Spring Security配置类
 */
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private SecurityService securityService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(securityService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //配置没有权限访问时跳转的自定义页面
        http.formLogin() //表单登陆
                .loginPage("/login.html") //登录页面设置
                .loginProcessingUrl("/user/login") //登录访问路径
                .defaultSuccessUrl("/test/index").permitAll(); //登录成功之后跳转路径

        http.authorizeHttpRequests() //认证配置
            .anyRequest() //任何请求
            .authenticated(); //所有请求都拦截

        http.csrf().disable(); //关闭跨站脚本攻击
    }

    /**
     * 将PasswordEncoder注入到ioc容器
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

2.3、自定义登陆页面

如果需要自定义登陆页面,则需要在Security的配置类SecurityConfig中进行配置,如图:
在这里插入图片描述

  • loginPage:设置登陆页面,当前案例登陆页面的位置是/resources/static/login.html
  • loginProcessingUrl:设置登陆访问的路径
  • defaultSuccessUrl:设置从login.html登陆成功之后跳转的路径,如果是从其他url访问,并且通过了认证,是不走这个 defaultSuccessUrl配置的路径的,直接跳转到当前访问的url

/resources/static/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/user/login" method="post">
    <!-- 这里务必注意,用户名和密码对应的name属性值必须是username和password-->
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    <input type="submit" value="登录">
</form>
</body>
</html>

/test/index

	@RequestMapping("/test/index")
    public String index(){
        return "欢迎使用xxx管理系统";
    }

2.4、测试

2.4.1、直接访问Controller

访问用于测试的Controller,会进行鉴权

	@RequestMapping("/hello")
    public String hello(){
        return "Hello Spring security";
    }

浏览器输入http://localhost:8080/hello访问Controller,会直接跳转到自定义的登陆页面
在这里插入图片描述
输入正确的用户名(tom)和密码(123),通过认证之后则会将请求转发给刚刚浏览器输入的URL
在这里插入图片描述
如果用户名或者密码输入错误,则不会通过鉴权,重新跳转回自定义的登陆页面

在这里插入图片描述

2.4.2、测试自定义的登陆页面

如果直接访问自定义的登陆页面/resources/static/login.html,如果登陆成功则会将请求转发给预设的URL,当前案例预设的URL是一个Controller(/test/index)
在这里插入图片描述

三、源代码

Security鉴权.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

820爆炸案(模拟案件)

文章目录模拟案件背景相关密码快压word邮箱BitLocker系统证书bestcrypt涉案图片模拟案件背景 8月20日18&#xff1a;00某市汽车站发生一起爆炸案件&#xff0c;经初步侦查&#xff0c;炸弹系通过手机远程引爆&#xff0c;办案人员经过综合研判分析&#xff0c;确定了引爆炸弹的…

在Mac电脑上怎么修改移动硬盘的读写权限?怎样修改mac电脑中移动硬盘的权限

在Mac电脑上怎么修改移动硬盘的读写权限&#xff1f;你是否遇到过把外部硬盘连接到Mac电脑后&#xff0c;外部硬盘只能读取不能写入的问题&#xff1f;大部分的情况是因为硬盘格式可能是Windows系统的格式&#xff0c;导致在mac电脑上只能读取不能写入。那我们要怎么才能正常的…

腾讯T3-3级资深架构师呕心整理:10万字节springboot教程全解!

前言: 可以毫不夸张地说&#xff0c;这篇文章介绍的 SpringBoot 教程基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个springboot的用法&#xff0c;文中都会都会有详细的教程解释。 本文总共从29个章节&#xff0c;248页PDF&#xff0c;阐述springboot在各种环境下的…

计算机毕设Python+Vue校园心理咨询平台(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Servlet应用(Request+response对象)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

测试架构师需要具备哪些能力?

目录 前言 为什么软件项目需要架构设计&#xff1f; 测试架构师需要解决什么问题&#xff1f; 测试架构师需要具备哪些能力&#xff1f; 测试工程师如何培养架构能力&#xff1f; 总结 重点&#xff1a;配套学习资料和视频教学 前言 相比于我们常见的研发架构师&#x…

微信机器人的构建与使用

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2022.12.15 Last edited: 2022.12.15 目录 《微信机器人》程序使用说明 微信机器人使用说明 1&#xff0e;项目说明 2. 系统环境 3.准备条…

Java+MySQL基于SSH的扶贫信息管理系统 开题 毕业设计

扶贫信息管理系统采用了B/S(浏览器/服务器)体系结构,JAVA作为开发语言,MySQL作为数据存储进行开发,Tomcat作为WEB服务器,开发平台windows,开发工具采用比elicpse更好用的myeclipse。系统角色分为用户和管理员,主要模块有&#xff1a;县管理模块、贫困户管理模块、扶贫文件管理模…

B站试用期刚过,被HR和大老板一起谈话,说我工作没任何问题,但今晚必须走人!...

最近B站的裁员消息大家关注了吗&#xff1f;一位B站的新员工哭诉&#xff1a;试用期刚过&#xff0c;就被HR和大老板一起谈话&#xff0c;说他工作态度、工作能力、工作产出都没有任何问题&#xff0c;但必须在12.16号走人&#xff01;他不接受&#xff0c;争辩了很久&#xff…

鉴源论坛 · 观模丨AUTOSAR调度表可调度性的形式化分析

作者 | 郭建 上海控安可信软件创新研究院特聘专家 版块 | 鉴源论坛 观模 汽车上大量软件和电子控制单元&#xff08;ECU,Electronic Control Unit&#xff09;的使用导致了汽车电子架构变得更为复杂&#xff0c;现如今从工厂生产的汽车更像是带轮子的电脑。现代汽车由大约50到…

Java+MySQL基于ssm的物理竞赛管理系统 开题 论文

物理竞赛是对课堂上所学的理论知识的实践运用,加深所学知识的理解,锻炼团队协作能力。学生可以根据个人爱好,个人特长选择参与,不仅能培养学生的创新意思、提高专业技能,还能锻炼学生的组织能力和协作能力。物理竞赛是在中国科协的领导下,由中国物理学会主办,各省、自治区、直辖…

windows11-IIS和nginx部署 vue3项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 IIS部署vue3项目一、IIS 安装二、解决404问题三、windows环境下安装/使用 nginx提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、IIS 安装 https…

Ac-Nle-P-Nle-D-AMC

Ac-nLPnLD-AMC, substrate for proteasome.Ac-nLPnLD-AMC&#xff0c;蛋白酶体底物。 编号: 185966中文名称: 蛋白酶体底物&#xff1a;Ac-Nle-Pro-Nle-Asp-7-氨基-4-甲基香豆素CAS号: 355140-49-7单字母: Ac-Nle-P-Nle-D-AMC三字母: Ac-Nle-Pro-Nle-Asp-AMC氨基酸个数: 4分子式…

高压放大器怎么选择型号的(高压放大器选型标准规范最新版)

高压放大器一般是指能够产生最大功率输出以驱动特定负载的装置&#xff0c;这是电子测量行业比较常见的一种仪器&#xff0c;可以对信号源的电压信号进行放大。 ATA-2000系列电压放大器选型指南&#xff1a; 高压放大器特点介绍&#xff1a; 1、可以输出1W以上更大的功率。 2、…

ReplicaSet和Deployment

ReplicaSet和Deployment 写在前面 语雀原文阅读效果更佳&#xff1a;198 ReplicaSet和Deployment 语雀 《198 ReplicaSet和Deployment》 1、ReplicaSet 假如我们现在有一个 Pod 正在提供线上的服务&#xff0c;我们来想想一下我们可能会遇到的一些场景&#xff1a; 某次运营…

[思考进阶]03 每一个成年人都应该掌握的学习技巧

除了要提升自己的技术能力&#xff0c;思维的学习和成长也非常非常重要&#xff0c;特推出此[思考进阶]系列&#xff0c;进行刻意练习&#xff0c;从而提升自己的认知。 这世间有两种人&#xff1a;一种被誉为天之骄子&#xff0c;拥有那种天才的创造能力&#xff0c;这种人极少…

React 入门:使用 Express 快速搭建web服务

文章目录什么是 ExpressExpress 用来做什么安装 Express创建 web 服务器启动服务器访问服务器什么是 Express 官方概念 Express 是基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架。通俗理解 Express 的作用和 Node.js 内置的 http 模块类似&#xff0c;是专门…

最近更换系统盘踩了不少坑,主要是软件运行错误,造成原成原系统盘被损毁

更换系统盘应该注意的问题&#xff1a; PE系统要是经过测试的系统&#xff0c;这次损毁的PE我很信任&#xff0c;但是有个克隆软件&#xff0c;今天一用就损毁了&#xff0c;他的名字是“Acronis True Image",不建议用他克隆整盘。 推荐几个经过严格测试的好用的PE&#…

我们公司使用了6年的Spring Boot项目部署方案,打包 + 一键部署,稳的一批

时间就如白驹过隙&#xff0c;转眼间已经是 2028 年了。小二入职一家初创公司已经 6 年了&#xff0c;眼瞅着开发团队从 3 个人壮大到 54 人&#xff0c;心里有时候会感觉挺不可思议的。 这些年&#xff0c;身边的同事来了又去&#xff0c;有些刚熟悉没多久&#xff0c;就因为…

java 项目之瑞吉外卖 笔记1 软件开发整体介绍 员工登录功能 登录过滤器设置

软件开发流程 角色分工 软件环境 开发环境搭建 创建工程 application.yml: server:port: 80 spring:application:name: reggie_takedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/r…