文档章节

SpringBoot 整合 SpringSecurity 之基于内存认证(一)

小灰灰Blog
 小灰灰Blog
发布于 01/15 09:21
字数 954
阅读 48
收藏 0

SpringBoot 整合 SpringSecurity 之基于内存认证(一)

在第一篇的教程中,我们简单的了解了一下 SpringSecurity 的使用姿势,添加依赖,在application.yml文件中加几行配置,就可以实现一个基本的登录认证;

默认的配置只能设置一个账号,那么如果需要多个账号可以怎么支持呢?

本文将介绍一下基于内存的认证方式

<!-- more -->

I. 内存认证

基于内存保存认证信息的方式,本篇博文中,会介绍两种常见的使用姿势

0. 项目配置

环境配置和前面一致,相关内容可以参考博文: 191223-SpringBoot 整合 SpringSecurity 之起源篇(零)

1. WebSecurityConfigurerAdapter

这里主要是借助SpringSecurity的配置适配器来处理,下面是一个简单的 case

@Configuration
public class SecurityAdapterConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 测试时,可以直接用下面的方式
        //        User.UserBuilder builder = User.withDefaultPasswordEncoder();
        User.UserBuilder builder = User.builder().passwordEncoder(passwordEncoder()::encode);
        auth.inMemoryAuthentication().withUser(builder.username("hui1").password("123456").roles("guest").build());
        auth.inMemoryAuthentication().withUser(builder.username("hui2").password("123456").roles("guest").build());
    }
}

主要逻辑在 configure这个方法中,但是需要注意,我们额外的设置了密码的加密方式, 当我们不设置这个的时候,实际登录的时候会发现,即便你输入了正确的用户名密码,也会提示失败(欢迎各位大佬实测一下)

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

其次,在创建用户的时候,需要注意的是,除了设置了用户名和密码之外,还给用户加上了一个角色,这个会在后续文章的 RBAC(基于角色的授权)中介绍它的作用

2. UserDetailsService

这里介绍另外一种方式,在后面的 db 中保存认证信息时,也会用到;在 SpringSecurity 的实现中,通过 UserDetailService 这个 bean 来根据用户名查询对应的用户信息;所以我们只需要实现一个我们自定义的 Bean 来替换默认的,就可以来实现我们的目标

我们的配置类如下

@Configuration
public class SecurityAutoConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 基于内存的认证方式
     *
     * @param passwordEncoder
     * @return
     */
    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
        User.UserBuilder users = User.builder().passwordEncoder(passwordEncoder::encode);
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(users.username("1hui").password("123456").roles("guest").build());
        manager.createUser(users.username("2hui").password("666666").roles("manager").build());
        manager.createUser(users.username("3hui").password("root").roles("admin").build());
        return manager;
    }
}

3. 测试

上面两种方式,都可以实现在内存中保存认证信息,接下来我们进入实测环节,首先写一个 http 接口

@RestController
public class IndexRest {

    public String getUser() {
        // 获取用户信息
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        String userName;
        if (principal instanceof UserDetails) {
            userName = ((UserDetails) principal).getUsername();
        } else {
            userName = principal.toString();
        }
        return userName;
    }

    /**
     * @return
     */
    @GetMapping(path = {"/"})
    public String index() {
        return "hello this is index! welcome " + getUser();
    }
}

在实际测试时,上面两种 case 都是 ok 的,下面的演示过程主要是基于第二种方式给出的示例

II. 其他

0. 系列博文&项目源码

博文

源码

1. 一灰灰 Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

一灰灰blog

© 著作权归作者所有

小灰灰Blog

小灰灰Blog

粉丝 217
博文 265
码字总数 470807
作品 0
武汉
程序员
私信 提问
SpringBoot+mybatis+springsecurity实现用户角色数据库管理

SpringSecurity是专门针对基于Spring项目的安全框架,充分利用了依赖注入和AOP来实现安全管控。在很多大型企业级系统中权限是最核心的部分,一个系统的好与坏全都在于权限管控是否灵活,是否...

ben4
2017/11/24
0
0
SpringBoot 整合(六)Security & Oauth2.0(完整篇)

1. 快速实现篇(实现最基本的登录): SpringSecurity 快速实现项目 2. 企业级封装篇 我的 Spring Security 文集 SpringBoot 整合 Security(一)实现用户认证并判断返回json还是view SpringBo...

FantJ
2018/05/22
0
0
SpringBoot简单配置SpringSecurity

以前工作用的登陆服务也不接SpringSecurity,所以这里写篇博客记录一下。使用SpringBoot接入SpringSecurity,我们先加入一些简单的依赖: 其中用的springBoot的版本是: 然后我们写一个Sprin...

woshixin
2019/10/07
104
0
Spring Security权限框架理论与实战演练

本章首先让大家学习到Spring Security权限框架的架构,之后大家可以学习到Spring Security权限框架的核心概念,包括拦截器、数据库管理、缓存、自定义决策等等,之后会手把手带大家基于Sprin...

芥末无疆sss
2018/10/18
0
0
springboot权限、session管理

大家好现在springboot都用什么管理权限以及session共享啊? 是 springboot + shiro 这个能实现session共享吗?多服务器的 还是 springboot + springsecurity + spring session? 还有 spring...

樱木花道VS康
2018/06/28
2.2K
1

没有更多内容

加载失败,请刷新页面

加载更多

分布式搜索引擎的架构是怎么设计的?

业内目前来说事实上的一个标准,就是分布式搜索引擎一般大家都用elasticsearch (1) es的分布式架构原理能说一下么(es是如何实现分布式的啊) 面试官心里分析 在搜索这块,lucene是最流行的搜...

Star永恒
22分钟前
97
0
集合转数组

ArrayList提供了一个将List转为数组的一个非常方便的方法toArray。toArray有两个重载的方法:   (1)list.toArray(); // 转换为Object类型的数组Object[] arr = list.toArray();for (...

那个猩猩很亮
25分钟前
78
0
使用canvas在前端添加水印

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" cont......

liyoungs
25分钟前
18
0
喜马拉雅音频下载工具 支持免费音频/VIP音频 文尾有彩蛋

最近流行喜马拉雅,趁你有会员,教你下载其资源 .如果没有会员可以找别人的会员获取cookie也可以.也没有别人的会员可以用此工具下载免费的音频也是不错的选择. 下载地址:https://www.90pan....

xiaogg
35分钟前
61
0
zookeeper安装(基础篇)

Zookeeper三种部署模式 1、Standalone模式,单节点部署,适合测试环境。2、伪cluster模式,单节点多实例部署,适合测试环境。3、Cluster模式,多节点集群部署,适合生产环境。 安装前准备...

丁小屁
38分钟前
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部