一文详解Spring Security的基本用法

目录
  • 1.引入依赖
  • 2.用户名和密码在哪里设置
  • 3.UserDetailsService接口详解
    • 3.1JdbcDaoImpl实现类
    • 3.2InMemoryUserDetailsManager实现类
    • 3.3自定义实现类实现UserDetailsService接口
  • 4.如何修改登录页面

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

1.引入依赖

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

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

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

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

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提供了三个UserDetailsService接口的实现类,分别是CachingUserDetailsServiceJdbcDaoImplInMemoryUserDetailsManager

3.1JdbcDaoImpl实现类

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

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

3.2InMemoryUserDetailsManager实现类

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

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

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

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

@Service
public 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;
    }
}

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

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

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

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

修改MyUserDetailsServiceImpl类如下:

@Service
public 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;
    }
}

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

4.如何修改登录页面

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

前端代码如下:

<form action="/login" class="login-form" >
    <h1>登录</h1>

    <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的基本用法的文章就介绍到这了,更多相关Spring Security用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Security的简单使用

    什么是Spring Security Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架.它实际上是保护基于spring的应用程序的标准. Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权.与所有Spring项目一样,Spring安全性的真正强大之处在于它可以轻松地扩展以满足定制需求 在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证.HTTP 表单验证.HTTP 摘要认证.OpenI

  • springsecurity 基本使用详解

    最近开始学习了springsecurity框架,为写后台页面做个权限管理什么的打基础. springsecurity是基础springboot的,所以创建一个springboot工程引入依赖就可以很轻松的整合springsecurity了.(类似的权限管理框架还有shiro) 1. 创建一个普通的springboot项目(不用勾选任何东西),我这边使用的springboot版本是2.2.1.RELEASE 依赖如下: pom.xml <dependencies> <!--spring w

  • java SpringSecurity使用详解

    目录 SpringSecurity 1.pom.xml 简介 1.pom.xml 2.Security的controller 3.路径转发的controller 注销及权限控制 1.导入依赖thymeleof整合security 2.html命名空间 3.根据用户的登录状态进行判断显示该有的信息 4.根据源码写表单name属性 5.实现有什么权限显示什么样的信息 6.注销logout-404 总结 SpringSecurity shrio,SpringSecurity:认证,授权(VIP1,vi

  • 一文详解Spring Security的基本用法

    目录 1.引入依赖 2.用户名和密码在哪里设置 3.UserDetailsService接口详解 3.1JdbcDaoImpl实现类 3.2InMemoryUserDetailsManager实现类 3.3自定义实现类实现UserDetailsService接口 4.如何修改登录页面 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架, 提供了完善的认证机制和方法级的授权功能.是一款非常优秀的权限管理框架.它的核心是一组过滤器链,不同的功能经由不同的过滤器. 今天通

  • 详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Security 提供的方式做授权,也可以自定义授权逻辑.一句话,你想怎么玩都可以! 今天松哥来和大家介绍一下 Spring Security 中四种常见的权限控制方式. 表达式控制 URL 路径权限 表达式控制方法权限 使用过滤注解 动态权限 四种方式,我们分别来看.  1.表达式控制 URL 路径权

  • 详解spring security四种实现方式

    spring security实现方式大致可以分为这几种: 1.配置文件实现,只需要在配置文件中指定拦截的url所需要权限.配置userDetailsService指定用户名.密码.对应权限,就可以实现. 2.实现UserDetailsService,loadUserByUsername(String userName)方法,根据userName来实现自己的业务逻辑返回UserDetails的实现类,需要自定义User类实现UserDetails,比较重要的方法是getAuthorities()

  • 详解Spring Security中获取当前登录用户的详细信息的几种方法

    目录 在Bean中获取用户信息 在Controller中获取用户信息 通过 Interface 获取用户信息 在JSP页面中获取用户信息 在Bean中获取用户信息 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentU

  • 详解Spring Security中权限注解的使用

    目录 1. 具体用法 2. SpEL 3. @PreAuthorize 最近有个小伙伴在微信群里问 Spring Security 权限注解的问题: 很多时候事情就是这么巧,松哥最近在做的 tienchin 也是基于注解来处理权限问题的,所以既然大家有这个问题,咱们就一块来聊聊这个话题. 当然一些基础的知识我就不讲了,对于 Spring Security 基本用法尚不熟悉的小伙伴,可在公众号后台回复 ss,有原创的系列教程. 1. 具体用法 先来看看 Spring Security 权限注解的具

  • 一文详解Spring加载properties文件的方式

    目录 一.druid的资源配置管理 二.c3p0资源配置管理 三.加载properties文件 不加载系统属性 加载多个properties文件 加载所有properties文件 加载properties文件标准格式 从类路径或jar包中搜索并加载properties文件 spring第三方资源配置管理 DruidDataSource ComboPooledDataSource 一.druid的资源配置管理 导入druid的坐标: <dependency> <groupId>com

  • 一文详解Spring如何控制Bean注入的顺序

    目录 简介 构造方法依赖(推荐) @DependsOn(不推荐) BeanPostProcessor(不推荐) 简介 说明 本文介绍Spring如何控制Bean注入的顺序. 首先需要说明的是:在Bean上加@Order(xxx)是无法控制bean注入的顺序的! 控制bean的加载顺序的方法 1.构造方法依赖 2.@DependsOn 注解 3.BeanPostProcessor 扩展 Bean初始化顺序与类加载顺序基本一致:静态变量/语句块=> 实例变量或初始化语句块=> 构造方法=>

  • 详解Spring Security如何在权限中使用通配符

    目录 前言 1. SpEL 2. 自定义权限该如何写 3. 权限通配符 4. TienChin 项目怎么做的 前言 小伙伴们知道,在 Shiro 中,默认是支持权限通配符的,例如系统用户有如下一些权限: system:user:add system:user:delete system:user:select system:user:update … 现在给用户授权的时候,我们可以像上面这样,一个权限一个权限的配置,也可以直接用通配符: system:user:* 这个通配符就表示拥有针对用户的

  • 一文详解Spring是怎么读取配置Xml文件的

    目录 Spring读取配置文件Document Element DocumentDefaultsDefinition Spring读取配置文件Document 在XmlBeanDefinitionReader.doLoadBeanDefinitions(InputSource inputSource, Resource resource)方法中将Xml文件转换成Document对象; Document doc = doLoadDocument(inputSource, resource); El

  • 一文详解Spring的Enablexxx注解使用实例

    目录 引言 @Enable 注解 @Import 注解 为什么要使用 @Import 注解呢 总结 引言 layout: post categories: Java title: 一文带你了解 Spring 的@Enablexxx 注解 tagline: by 子悠 tags: - 子悠 前面的文章给大家介绍 Spring 的重试机制的时候有提到过 Spring 有很多 @Enable 开头的注解,平时在使用的时候也没有注意过为什么会有这些注解,今天就给大家介绍一下. @Enable 注解 首先

随机推荐