SpringSecurity[3]-自定义登录逻辑,自定义登录页面,以及认证过程的其他配置

news2024/11/25 11:02:47

前一篇:SpringSecurity[2]-UserDetailsService详解以及PasswordEncoder密码解析器详解

链接:SpringSecurity[2]-UserDetailsService详解以及PasswordEncoder密码解析器详解_豆虫儿的博客-CSDN博客

五、自定义登录逻辑

当进行自定义登录逻辑时需要用到之前讲解的UserDetailsService和PasswordEncoder。但是Spring Security要求:当进行自定义登录逻辑时容器内必须有PasswordEncoder实例。所以不能直接new对象。

1.编写配置类

新建类com.msb.config.SecurityConfig 编写下面内容

@Configuration
public class SecurityConfig {
    @Bean
    public PasswordEncoder getPwdEncoder(){
        return new BCryptPasswordEncoder();
    }
}

2.自定义逻辑

在Spring Security中实现UserDetailService就表示为用户详情服务。在这个类中编写用户认证逻辑。

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private PasswordEncoder encoder;
​
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //1. 查询数据库判断用户名是否存在,如果不存在抛出UsernameNotFoundException
​
        if(!username.equals("admin")){
            throw new UsernameNotFoundException("用户名不存在");
        }
        //把查询出来的密码进行解析,或直接把password放到构造方法中。
        //理解:password就是数据库中查询出来的密码,查询出来的内容不是123
        String password = encoder.encode("123");
​
        return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}

3.查看效果

重启项目后,在浏览器中输入账号:admin,密码:123。后可以正确进入到login.html页面。

六、自定义登录页面

虽然Spring Security给我们提供了登录页面,但是对于实际项目中,大多喜欢使用自己的登录页面。所以Spring Security中不仅仅提供了登录页面,还支持用户自定义登录页面。实现过程也比较简单,只需要修改配置类即可。

1.编写登录页面

别写登录页面,登录页面中<form>的action不编写对应控制器也可以。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>内容</title>
</head>
<body>
<form action="/login" method="post">
    <input type="text" name="username"/>
    <input type="password" name="password"/>
    <input type="submit" value="提交"/>
</form>
​
</body>
</html>

2.修改配置类

修改配置类中主要是设置哪个页面是登录页面。配置类需要继承WebSecurityConfigurerAdapter,并重写configure方法。

  1. successForwardUrl()登录成功后跳转地址
  2. loginPage() 登录页面
  3. loginProcessingUrl 登录页面表单提交地址,此地址可以不真实存在。
  4. antMatchers():匹配内容
  5. permitAll():允许
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
​
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 表单认证
            http.formLogin()
                 .loginProcessingUrl("/login")   
                //当发现/login时认为是登录,需要执行
             UserDetailsServiceImpl
                    .successForwardUrl("/toMain")   //此处是post请求
                    .loginPage("/login.html");
​
        // url 拦截
        http.authorizeRequests()
                .antMatchers("/login.html").permitAll() //login.html不需要被认证
                .anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。
​
        //关闭csrf防护
        http.csrf().disable();
    }
    @Bean
    public PasswordEncoder getPe(){
        return new BCryptPasswordEncoder();
    }
}

3.编写控制器

编写控制器,当用户登录成功后跳转toMain控制器。编写完成控制器后编写main.html。页面中随意写上一句话表示main.html页面内容即可。而之前的/login控制器方法是不执行的,所以可以删除了。

@Controller
public class LoginController {
//    该方法不会被执行
//    @RequestMapping("/login")
//    public String login(){
//        System.out.println("执行了login方法");
//        return "redirect:main.html";
//    }
​
    @PostMapping("/toMain")
    public String toMain(){
        return "redirect:/main.html";
    }
}

七、 认证过程其他常用配置

1.失败跳转

表单处理中成功会跳转到一个地址,失败也可以跳转到一个地址中。

1.1编写页面

在src/main/resources/static下新建fail.html并编写如下内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 操作失败,请重新登录. <a href="/login.html">跳转</a>
</body>
</html>

1.2修改表单配置

在配置方法中表单认证部分添加failureForwardUrl()方法,表示登录失败跳转的url。此处依然是POST请求,所以跳转到可以接收POST请求的控制器/fail中。

// 表单认证
http.formLogin()
        .loginProcessingUrl("/login")   //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
        .successForwardUrl("/toMain")   //此处是post请求
        .failureForwardUrl("/fail")     //登录失败跳转地址
        .loginPage("/login.html");

1.3添加控制器方法

在控制器类中添加控制器方法,方法映射路径/fail。此处要注意:由于是POST请求访问/fail。所以如果返回值直接转发到fail.html中,及时有效果,控制台也会报警告,提示fail.html不支持POST访问方式。

@PostMapping("/fail")
public String fail(){
    return "redirect:/fail.html";
}

1.4设置fail.html不需要认证

认证失败跳转到fail.html页面中,所以必须配置fail.html不需要被认证。需要修改配置类中内容

// url 拦截
http.authorizeRequests()
        .antMatchers("/login.html").permitAll() //login.html不需要被认证
        .antMatchers("/fail.html").permitAll()  //fail.html不需要被认证
        .anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。

2.设置请求账户和密码的参数名

2.1源码简介

当进行登录时会执行UsernamePasswordAuthenticationFilter过滤器。

  1. usernamePasrameter:账户参数名
  2. passwordParameter:密码参数名
  3. postOnly=true:默认情况下只允许POST请求。

2.2修改配置

// 表单认证
http.formLogin()
        .loginProcessingUrl("/login")   //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
        .successForwardUrl("/toMain")   //此处是post请求
        .failureForwardUrl("/fail")     //登录失败跳转地址
        .loginPage("/login.html")
        .usernameParameter("myusername")
        .passwordParameter("mypassword");

2.3修改页面

修改login.html

<form action = "/login" method="post">
    用户名:<input type="text" name="myusername"/><br/>
    密码:<input type="password" name="mypassword"/><br/>
    <input type="submit" value="登录"/>
</form>

3.自定义登录成功处理器

3.1源码分析

使用successForwardUrl()时表示成功后转发请求到地址。内部是通过successHandler()方法进行控制成功后交给哪个类进行处理

ForwardAuthenticationSuccessHandler内部就是最简单的请求转发。由于是请求转发,当遇到需要跳转到站外或在前后端分离的项目中就无法使用了。

当需要控制登录成功后去做一些事情时,可以进行自定义认证成功控制器。

3.2代码实现

3.2.1自定义类

新建类com.msb.handler.MyAuthenticationSuccessHandler编写如下:

public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
        //Principal 主体,存放了登录用户的信息
        User user = (User)authentication.getPrincipal();
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());//密码输出为null
        System.out.println(user.getAuthorities());
        //重定向到百度。这只是一个示例,具体需要看项目业务需求
        httpServletResponse.sendRedirect("http://www.baidu.com");
    }
}

3.2.2修改配置项

使用successHandler()方法设置成功后交给哪个对象进行处理

// 表单认证
http.formLogin()
        .loginProcessingUrl("/login")   //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
        .successHandler(new MyAuthenticationSuccessHandler())
        //.successForwardUrl("/toMain")   //此处是post请求
        .failureForwardUrl("/fail")     //登录失败跳转地址
        .loginPage("/login.html");

4.自定义登录失败处理器

4.1源码分析

failureForwardUrl()内部调用的是failureHandler()方法

ForwardAuthenticationFailureHandler中也是一个请求转发,并在request作用域中设置 SPRING_SECURITY_LAST_EXCEPTION的key,内容为异常对象。

4.2代码实现

4.2.1新建控制器

新建com.msb.handler.MyForwardAuthenticationFailureHandler实现AuthenticationFailureHandler。在方法中添加重定向语句

public class MyForwardAuthenticationFailureHandler implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.sendRedirect("/fail.html");
    }
}

4.2.2修改配置类

修改配置类中表单登录部分。设置失败时交给失败处理器进行操作。failureForwardUrl和failureHandler不可共存。

        // 表单认证
        http.formLogin()
                .loginProcessingUrl("/login")   //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
                .successHandler(new MyAuthenticationSuccessHandler())
                //.successForwardUrl("/toMain")   //此处是post请求
                .failureHandler(new MyForwardAuthenticationFailureHandler())
//                .failureForwardUrl("/fail")     //登录失败跳转地址
                .loginPage("/login.html");

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

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

相关文章

Java泛型的作用以及如何使用(继承、接口、方法、通配符) 附源码

&#x1f34b;1. 泛型的定义 class 类名称<泛型标识, 泛型标识, ....>{private 泛型标识 变量名称;....... } 常用的泛型标识字符 :T, E, K, V E - Element (在集合中使用&#xff0c;由于集合中存放的是元素)&#xff0c;E是对各方法中的泛型类型进行限制&#xff0c;…

【微服务技术06】Nacos注册中心

【微服务技术06】Nacos注册中心 案例代码&#xff1a;https://gitee.com/pikachu2333/spring-cloud-hexuan 安装Nacos 安装nacos&#xff1a;https://github.com/alibaba/nacos/releases 单机启动&#xff1a;sh startup.sh -m standalone 访问&#xff1a;http://127.0.0.1…

操作系统,计算机网络,数据库刷题笔记10

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记10 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…

yolov5修改骨干网络-使用pytorch自带的网络-以Mobilenet和efficientnet为例

通过 yolov5修改骨干网络–原网络说明 我们知道&#xff1a;yolov5.yaml中存放的是我们模型构建参数&#xff0c;具体构建过程在yolo.py中的parse_model函数&#xff0c;通过循环遍历yolov5.yaml给的参数&#xff0c;去寻找网络名称&#xff0c;并将args的参数传入网络&#xf…

获取bean的三种方式和注意事项

获取bean的三种方式和注意事项 spring-ioc.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

PUMA:DOA估计模式的改进实现(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

北京旅游HTML学生网页设计作品 dreamweaver作业静态HTML网页设计模板 北京旅游景点网页作业制作 HTML+CSS+JS

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

口诀速记 DataFrame 指定行列的数据

口诀速记DataFrame 指定行列的数据一、loc函数和iloc函数获取指定行列的数据二、loc和iloc的切片操作三、[] 语法获取指定行列的数据✅作者简介&#xff1a;大家好我是爱康代码 &#x1f4c3;个人主页&#xff1a;链接: 点一下这里就进入爱康代码的主页链接&#xff0c;欢迎参观…

深入:9种设计模式在Mybatis中的运用

虽然我们都知道有26个设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大量的设计模式&#xff0c;阅读源码并观察设计模式在其中的应用&#xff0c;能够更深入的理解设计模式。 Mybatis至少遇到了以下的设计模式的…

接口优化技巧

1. 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){insert(detail); }优化后&#xff1a; batchInsert(transDetailList);打个比喻&#xff1a; 打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电…

怎么进行多人配音?建议收藏这些方法

相信不少小伙伴平时在网上冲浪的时候&#xff0c;经常会刷到一些搞笑视频吧。这些搞笑视频的配音&#xff0c;通常都是以一人分饰多角或者是多人互动对话的形式进行配音的。那有没有小伙伴有着不错的搞笑创意点子&#xff0c;但是苦于没有人配音呢&#xff1f;其实我们可以使用…

电脑之间通信的大致过程

本文来自对网络工程师之路内容的个人总结&#xff0c;仅供个人复习参考。 1.电脑之间通信就需要有线路&#xff0c;但是如果多台电脑互相之间需要通信&#xff0c;那么就需要有很多根线&#xff0c;每台电脑需要有多网卡&#xff0c;为了解决这个问题&#xff0c;(集线器)Hub就…

360度内环镜、内螺纹检测镜头、瓶盖检测镜头以及超中心镜头

用于孔洞状物体的360内部成像 提示&#xff1a; 内孔检测光学镜头 从外部检查腔内&#xff1b;无需在孔洞内放置光学探头&#xff1b;带孔对象的360度对焦&#xff1b;腔体内壁和底部都可以实现高分辨率成像&#xff1b;景深可使同一个镜头拍摄具有不同形状和尺寸的物体&…

Bidirectional Recurrent Neural Networks

摘要 a regular recurrent neural network &#xff08;RNN&#xff09; →\rightarrow→ a bidirectional recurrent neural network (BRNN)a preset future frame&#xff1a; 预设的未来架构。. Structure and training procedure&#xff1a; 架构和训练程序。TIMIT datab…

Java多线程之:详解ThreadPoolExecutor执行源码分析

文章目录线程池的实现原理详解ThreadPoolExecutor核心数据结构核心配置参数解释线程池的优雅关闭线程池的生命周期正确关闭线程池的步骤shutdown()与shutdownNow()的区别任务的提交过程分析任务的执行过程分析shutdown()与任务执行过程综合分析shutdownNow() 与任务执行过程综合…

【大一大二必看】计算机专业的同学应该参加哪些比赛?

文章目录1. 前言2. ICPC3. CCPC4. 蓝桥杯5. 天梯赛6. CCF CSP7. PAT8. 全国高校计算机能力挑战赛9. 其他&#x1f351; 天池大赛&#x1f351; 华为软件精英挑战赛&#x1f351; LeetCode 周赛 / 双周赛&#x1f351; CSDN 编程竞赛总结1. 前言 2022 年已经过半&#xff0c;对…

java版商城 b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买…

巡检过程中有哪些注意事项?智能巡检了解一下

智能巡检系统是现场过程管理的生产力革命&#xff0c;由人工记录蝶化为掌上电脑运作&#xff0c;适用于设备运行值班记录、仓库/资产管理、设备巡检保养、安全巡更、机房值守、基站维护等一切重复性的工作管理。 安全巡检的目的在于识别信息系统存在的安全脆弱性、分析信息系统…

2022-12-14 移植Qt Creator helloworld 应用到ARM平台运行过程,我这里用buildroot里面的编译器。

一、在ubuntu上运行可执行文件。 1、ubuntu里面安装qt creator 建立helloworld 工程&#xff0c;点击run就可以运行&#xff0c;运行如下。 2、在ubuntu上运行方法二&#xff1a;同级目录下有build-helloworld-Desktop_Qt_5_12_12_GCC_64bit-Debug&#xff0c;用file hellowor…

VS使用技巧汇总

总目录 文章目录总目录前言一、快捷技巧1.代码片段快捷方式2.选择性粘贴3.快速停靠窗口4.多行同步快速编辑5.引用命名空间6.整行上下移动7.规整代码格式二、其他技巧1.其他总结前言 本文会持续收录一些VS的使用技巧&#xff0c;掌握VS一些常用的使用技巧对于提高我们编程效率很…