文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Security怎么使用

2023-06-30 15:39

关注

这篇文章主要介绍“Spring Security怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Security怎么使用”文章能帮助大家解决问题。

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架, 提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。它的核心是一组过滤器链,不同的功能经由不同的过滤器。 

1.引入依赖

在项目中引入Spring Security依赖,代码如下:

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

引入依赖后,整个项目都被Spring Security保护起来,所有的接口都要登录之后才能访问了,例如,我需要访问/doc.html接口文档,直接跳到登录页面。如下图:

Spring Security怎么使用

这时,你会有十万个为什么啦?这个页面哪里的?这个用户名和密码是啥?等等。不着急,听我一一道来。

2.用户名和密码在哪里设置

当我们引入了Spring Secruity依赖后,启动项目之后,密码就会在控制台中输出的,格式是UUID,每一次启动密码都不一样的,而用户名是默认是User的。

Using generated security password: 8b2d752b-8892-4cd3-a7a9-a36e79e1cad8

我们可以通过项目的配置文件自定义用户名和密码的,代码如下,这样每次重启项目,用户名和密码都是固定不变的。

spring:  security:      user:        name: didiplus        password: didiplus

3.UserDetailsService接口详解

UserDetailsService接口只有一个抽象方法就是loadUserByUsername(String username)。代码如下:

public interface UserDetailsService {UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;}

UserDetailsService接口的返回值是UserDetails接口, 这又是一个接口,Spring Security框架提供了它的实现类org.springframework.security.core.userdetails包下的User类对象 。userdetails源码如下:

Spring Security怎么使用

Spring Security提供了三个UserDetailsService接口的实现类,分别是CachingUserDetailsServiceJdbcDaoImplInMemoryUserDetailsManager

3.1JdbcDaoImpl实现类

Spring Security怎么使用

该实现类是通过数据库获取用户名和密码,JdbcUserDetailsManager中定义了一大堆SQL语句,如下:

Spring Security怎么使用

接着我们在看一下JdbcDaoImpl中的loadUsersByUsername方法,如下:

Spring Security怎么使用

3.2InMemoryUserDetailsManager实现类

Spring Security怎么使用

以上代码是判断内存中的HashMap集合中是否有用户数据对应的User对象,如果没有,直接抛出异常,如果有就返回该用户的User对象信息。

Spring Security怎么使用

以上代码是把配置文件中的User相关信息读取到。通过分析源码发现 Spring Security框架完成用户登录认证的核心就在与org.springframework.security.core.userdetails包下的UserDetailsService接口。

3.3自定义实现类实现UserDetailsService接口

自定义实现类MyUserDetailsServiceImpl,代码如下:

@Servicepublic class MyUserDetailsServiceImpl implements UserDetailsService {    private static  final  String USERNAME="admin";    private static  final  String PASSWORD="admin123";     @Override    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {        if (!USERNAME.equals(username)){            throw new UsernameNotFoundException("用户名不存在");        }        UserDetails userDetails =  new User(USERNAME,PASSWORD, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,common"));        return userDetails;    }}

重启项目看看,输入定义的用户名和密码,发现登录不了,查看控制台发现报错,提示如下:

Spring Security怎么使用

报错的原因是没有使用任何的PasswordEncoder,我们输入的密码没有用加密工具进行加密 。 Spring Security其实已经给我们提供了很多的PasswordEncoder 。 在org.springframework.security.crypto.password包下有一个PasswordEncoder接口,看看他的实现类

Spring Security怎么使用

把这个PasswordEncoder的任意一个我们需要用来加密密码的实现类的Bean注入到容器里面,就可以直接拿来使用 ,代码如下:

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {    @Bean    public BCryptPasswordEncoder bCryptPasswordEncoder(){        return new BCryptPasswordEncoder();    }}

修改MyUserDetailsServiceImpl类如下:

@Servicepublic class MyUserDetailsServiceImpl implements UserDetailsService {    private static  final  String USERNAME="admin";    private static  final  String PASSWORD="admin123";    @Resource    BCryptPasswordEncoder cryptPasswordEncoder;    @Override    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {        if (!USERNAME.equals(username)){            throw new UsernameNotFoundException("用户名不存在");        }        UserDetails userDetails =  new User(USERNAME,cryptPasswordEncoder.encode(PASSWORD), AuthorityUtils.commaSeparatedStringToAuthorityList("admin,common"));        return userDetails;    }}

重启项目再次测试,输入定义的账号和密码。即可访问到接口文档页面。

Spring Security怎么使用

4.如何修改登录页面

觉得默认的登录页面很丑,我们如何定义自己的登录页面呢?方法也很简单,首先我们先去准备一个登录页面。如下:

Spring Security怎么使用

前端代码如下:

<form action="/login" class="login-form" >    <h2>登录</h2>    <div class="txtb">        <input type="text" name="user">        <span data-placeholder="Username"></span>    </div>    <div class="txtb">        <input type="password" name="pass">        <span data-placeholder="Password"></span>    </div>    <input type="submit" class="logbtn" value="登录">    <div class="bottom-text">        Don't have account? <a href="#" rel="external nofollow" >Sign up</a>    </div></form>

把登录页面文件存放到项目的资源文件夹中static目录下,然后在SecurityConfig重写configure(HttpSecurity http)这个方法,代码如下:

    @Override    protected void configure(HttpSecurity http) throws Exception {        http.formLogin()                .loginPage("/login.html") #自定义登录页面                .usernameParameter("user") #对应前端表达name属性                .passwordParameter("pass") #对应前端表达name属性                .loginProcessingUrl("/login")                .defaultSuccessUrl("/doc.html") #登录成功后跳转的页面地址                .failureUrl("/login?error=true")                .and()                .authorizeRequests()                .antMatchers("/login.html").permitAll() #放通登录页面                .anyRequest().authenticated(); #其他请求都要认证        http.csrf().disable();    }

重新启动项目,输入定义的用户名和密码,登录成功直接跳转到/doc.html

antMatchers("url").permitAll() 是把某个url放通,不需要登录就能访问。

关于“Spring Security怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯