Spring安全性和密码编码

在以前的文章中,我们深入探讨了Spring安全性。 我们实现了由jdbc支持的安全性,基于自定义 jdbc查询的安全性以及从nosql数据库检索安全性的信息。

通过足够小心,我们会发现密码为纯文本格式。 尽管这在实际环境中可以很好地用于示例目的,但密码始终会进行编码并以编码方式存储在数据库中。

Spring Security以一种非常方便的方式支持密码编码。 它带有自己的预配置密码编码器,但是它也使我们能够创建自定义密码编码器。

SpringPassword安全附带有一些密码编码器,例如StandardPasswordEncoder,Md5PasswordEncoder和流行的BCryptPasswordEncoder。

package com.gkatzioura.spring.security;import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.StandardPasswordEncoder;/*** Created by gkatzioura on 10/5/16.*/
public class EncoderTest {private static final Logger LOGGER = LoggerFactory.getLogger(EncoderTest.class);@Testpublic void md5Encoder() {Md5PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder();String encoded = md5PasswordEncoder.encodePassword("test_pass",null);LOGGER.info("Md5 encoded "+encoded);}@Testpublic void bcryptEncoder() {BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();String encoded = bCryptPasswordEncoder.encode("test_pass");LOGGER.info("Becrypt encoded "+encoded);}@Testpublic void standardEncoder() {StandardPasswordEncoder standardPasswordEncoder = new StandardPasswordEncoder();String encoded = standardPasswordEncoder.encode("test_pass");LOGGER.info("Standard encoded "+encoded);}}

要添加密码编码,我们要做的就是在spring配置中设置密码编码器。

使用jdbc支持的spring安全配置,这非常简单,我们只需设置我们选择的密码编码器即可。 在本例中,我们将使用md5密码编码器。

package com.gkatzioura.spring.security.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
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 javax.sql.DataSource;/*** Created by gkatzioura on 10/5/16.*/
@EnableWebSecurity
@Profile("encodedjdbcpassword")
public class PasswordEncodedSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate DataSource dataSource;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(new Md5PasswordEncoder()).usersByUsernameQuery("SELECT username,password,1 FROM Custom_Users_Encoded_pass where username=?").authoritiesByUsernameQuery("SELECT username,authority FROM Custom_Roles where username=?");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public").permitAll().anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}}

然后,我们将使用编码后的密码将用户添加到数据库。

drop table if exists Custom_Users_Encoded_pass;
create table Custom_Users_Encoded_pass(id bigint auto_increment, username varchar(255), password varchar(255));
-- real password is test_pass
insert into Custom_Users_Encoded_pass(username,password) values('TestUser','4ac1b63dca561d274c6055ebf3ed97db');

因此,通过尝试访问http:// localhost:8080 / secured,必须在登录提示中提供用户名TestUser和密码test_pass。

最后但并非最不重要的一点是,我们将必须更改gradle.build,以将encodejdbcpassword设置为默认配置文件。

bootRun {systemProperty "spring.profiles.active", "encodedjdbcpassword"
}

您可以在github上找到源代码。

翻译自: https://www.javacodegeeks.com/2016/10/spring-security-password-encoding.html

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

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

相关文章

SAS宏技术中,%let和call symput有什么区别?

平时经常使用的宏变量定义方法有三种: 1. %let xxxyyy; 2. Call Symput(xxx,yyy); 3. select xxx into: yyy. 三种定义方式最大的区别是在MACRO函数内定义所生成的宏变量的类型不同: Call Symput在宏函数中定义的宏变量可以在函数外调用;而%…

阿里巴巴的开源项目Druid(关于数据库连接)

原文地址:http://www.iteye.com/magazines/90文章简介 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQLParser。Druid支持所有JDBC兼容的数据库&a…

springcloud服务注册和发现

微服务架构中,服务发现组件是一个非常关键的组件,服务消费者、服务提供者、服务发现组件的关系大致如下: 各个微服务启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息服务消费者可从服务…

sas infile和filename

3.1 追加原始文件 原始数据可以使用以下的方法进行纵合并。INFILE语句 FILENAME语句 FILEVAR选项 操作系统自身的技术 首先,你可能要察看原始数据。可以用FSLIST过程。 语法: PROC FSLIST FILE file-specification; RUN; 实际使用中,专门的编…

Java 多线程(六) synchronized关键字详解

多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。 同步机制可以使用synchronized关键字实现。 当synchronized关键字修饰一个方法的时候,该方法叫做同…

java自动化_作为测试工程师进阶自动化选Java还是Python?

这是很多测试工程师从功能跨入自动化纠结的问题,今天本文带大家一探究竟。Java和Python一直都是两种很火的语言,用Python的一定觉得Python好,用Java的只觉得Java好。Java语言 VS Python语言Java自动化方法 VS Python自动化方法综上所述&…

Spring –添加Spring MVC –第2部分

在上一部分中,我们为经理和员工实现了控制器。 既然我们知道了自己的出路,我们将做很少(但仅做很少)更复杂的事情-任务和时间表的控制器。 因此,让我们从org.timesheet.web开始。 TaskController 。 首先创建一个类&am…

CALL SYMPUT与CALL SYMPUTX区别

call symput 在data步中将值塞入宏变量http://www2.sas.com/proceedings/sugi29/052-29.pdf [SAS] CALL SYMPUT与CALL SYMPUTX CALL SYMPUT的功能是可以在DATA step内将值塞到一个macro变量里面。如果这个macro变量已经存在,那这个call就会更新该macro变量的值。 CA…

Linux基本结构

一个完整地Linux操作系统由4部分组成,即内核(Kernel)、外壳(Shell)、实用程序(Utilities)和应用程序(Applications)。 (1)内核是Linux的心脏&…

jmeter使用_jmeter工具的使用

1.本地下载到官网,5.3版本的对应的是jdk8版本,就用这个了2.解压进入bin目录,找到jmeter.bat启动它,会弹出两个窗口,一个是启动窗口,使用jmeter不可以关了它,另一个是jmeter的工作界面进入界面默…

UliPad 初体验----python 开发利器

学习python 有段时间,最近博客更新比较慢了,空闲时间在零零碎碎的学python ,难成文,也就没整理成博客。 学习python 最苦恼的就是没有趁手IDE ,之前学java 时 Eclipse 肯定是不二之选。eclipse pydev 也可以开发python…

Neo4j:找到两个纬度/经度之间的中点

在过去的两个周末中,我一直在处理一些运输数据,并且我想运行A *算法来查找两个车站之间的最快路线。 A *算法将一个EstimateEvaluator作为其参数之一,然后该评估器查看节点的经度/纬度,以确定一条路径是否值得遵循。 因此&#x…

猫狗大战

可行性背包 令dp[i][j]表示选i个人能否达到j这个状态,那么转移就和背包一样了,外层枚举选哪一个(K),2、3层枚举i,j,那么\[dp[i][j] | dp[i-1][j-val[k]];\] 转载于:https://www.cnblogs.com/bullshit/p/9902003.html

SAS的数组array介绍

SAS可以把一组同为数值型或同为字符型的变量合在一起,使用同一个名字称呼,用下标来区分。这与通常的程序设计语言中的数组略有区别,通常的程序设计语言中数组元素没有对应的变量名,而SAS数组每个元素都有自己的变量名。 一、数值型…

python while循环if_详解python基础之while循环及if判断

wlile循环while True表示永远为真,不管是什么条件都会向下执行,下面是写的一个例子。#!/usr/bin/env pythonage 24                            #给age赋一个值while True:                       …

关于页面的多种自适应布局——两列布局

我们在切页面的时候打交道最多的就是关于布局排版的技巧&#xff0c;我这里总结了一些平时做页面时用的到各种布局技巧&#xff0c;作为笔记便于日后随时查询。 1、简单结构1&#xff0c;列表在前&#xff0c;内容在后 1 <style type"text/css">2 .layout{back…

很全的sas基础知识

5.1 SAS表达式简介   &#xff11;&#xff0e;SAS常数表达式   (1)数值常数 如: 1.23、 -5、 0.5E-10。   (2)字符常数 如: name1TOME、 name2MARY、name3JOHN。   (3)日期(d)、时间(t)、日时(dt)常数 如: d101JAN80d、t19:25:19t、   dt118JAN80:9:27:05dt。  …

kitti数据集_KITTI数据集激光雷达坐标系下的里程计真值

由KITTI数据集Odometry模块的devkit_odometrydevkitreadme.txt所述&#xff0c;KITII数据集提供里程计的真值是在左相机表坐标系下的&#xff0c;并没有提供激光雷达坐标系下的真值。因此&#xff0c;求得激光雷达坐标系下的真值&#xff0c;对我们使用KITTI数据集进行点云处理…

python中文处理

一、使用中文字符 在python源码中如果使用了中文字符&#xff0c;运行时会有错误&#xff0c;解决的办法是在源码的开头部分加入字符编码的声明&#xff0c;下面是一个例子&#xff1a;#!/usr/bin/env python# -*- coding: cp936 -*-Python Tutorial中指出&#xff0c;python的…

信号量使用例子_用信号量锁定:一个例子

信号量使用例子并发是带来有趣挑战的一个方面。 如果处理不当&#xff0c;会带来种族问题&#xff0c;这会使人们感到困惑&#xff0c;因为这些问题有时会突然出现&#xff0c;并且有时会正常工作。 当处理访问公共资源的并发线程时&#xff0c;Java语言提供了许多处理竞争条件…