使用Spring Security和jdbc的Spring Boot

Spring安全性是一个很棒的框架,可节省开发人员的大量时间和精力。 此外,它还具有足够的灵活性,可以自定义并满足您的需求。

使用JDBC和Spring Security非常容易,并且许多操作是自动化的。 这将是一个最小的展示。

gradle文件包含诸如spring-security,spring-jdbc和h2数据库之类的依赖项

group 'com.gkatzioura'
version '1.0-SNAPSHOT'buildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE")}
}apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'sourceCompatibility = 1.8repositories {mavenCentral()
}dependencies {compile("org.springframework.boot:spring-boot-starter-web")compile("org.thymeleaf:thymeleaf-spring4")compile("org.springframework.boot:spring-boot-starter-security")compile("org.springframework:spring-jdbc")compile("com.h2database:h2:1.4.192")compile("org.slf4j:slf4j-api:1.6.6")compile("ch.qos.logback:logback-core:1.1.7")compile("ch.qos.logback:logback-classic:1.1.7")testCompile "junit:junit:4.11"
}

必须创建包含某些信息的表。 这些表将具有Spring安全性查询的默认名称和列名称,以获取信息。

drop table if exists users;
create table users(id bigint auto_increment, username varchar(255), password varchar(255), enabled boolean);
insert into users(username,password,enabled) values('steve','steve',true);
insert into users(username,password,enabled) values('john','john',true);
drop table if exists authorities;
create table authorities(username  varchar(255),authority  varchar(255), UNIQUE(username,authority));
insert into authorities(username,authority) values('steve','admin');
insert into authorities(username,authority) values('john','superadmin');

这些sql语句将驻留在resources / schema.sql上。

第一步是创建我们的Application类

package com.gkatzioura.spring.security;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Created by gkatzioura on 9/2/16.*/
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

为了快速入门,该数据库将为h2数据库。

package com.gkatzioura.spring.security.config;import org.h2.jdbcx.JdbcDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;
import java.nio.file.Files;/*** Created by gkatzioura on 9/2/16.*/
@Configuration
public class DataSourceConfig {@Beanpublic DataSource createDataSource() {JdbcDataSource dataSource = new JdbcDataSource();dataSource.setURL("jdbc:h2:"+System.getProperty("java.io.tmpdir")+"/database");return dataSource;}}

通过指定h2数据库,我将该目录设置为临时目录内。 因此,一旦重新启动操作系统,数据库将消失。
如前所述以前一旦数据源豆已初始化弹簧JDBC会自动查找上一个schema.sql文件的文件资源文件夹。 如果文件存在,spring-jdbc将尝试执行schema.sql包含的语句。

下一步是定义我们的安全配置。 我们必须指定我们的安全性将基于jdbc。 同样,我们必须定义必须安全的端点。

package com.gkatzioura.spring.security.config;import org.springframework.beans.factory.annotation.Autowired;
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 9/2/16.*/
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate DataSource dataSource;@Autowiredpublic void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource);}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public").permitAll().anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}
}

最后但并非最不重要的一点是,我们将添加具有安全端点和非安全端点的控制器

package com.gkatzioura.spring.security.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;/*** Created by gkatzioura on 9/2/16.*/
@RestController
public class GreetController {private static final Logger LOGGER = LoggerFactory.getLogger(GreetController.class);@RequestMapping(path = "/public",method = RequestMethod.GET)public String sayFreeHi() {return "Greeting";}@RequestMapping(path = "/secured",method = RequestMethod.GET)public String saySecureHi() {return "Secured";}}

一旦尝试访问安全端点,将显示默认的spring security登录屏幕。
继续执行sql语句中指定的用户之一(例如,用户名:steve密码:steve)。 如果您要注销,只需点击/ login?logout端点即可。

运行带有

gradle bootRun

而且你很好。

您可以在github上找到源代码

翻译自: https://www.javacodegeeks.com/2016/09/spring-boot-spring-security-jdbc.html

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

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

相关文章

map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解

不知道最近有没有被一道Java面试题刷爆朋友圈,Spring框架的循环依赖如何解决。我收到了不少粉丝的提问,在了解到之后,也去网上查询了一些资料,自己也询问了身边的同事,总结出以下几个方面,今天就和我来看一…

调用ThunderAgent 迅雷局域网版的开发

P2P方式的下载,为我们获取互联网资料提供了一个强有力的工具,它可以争取最大的带宽,获取最大的下载速度。最早采用P2P方式下载的工具有BT、电骡等,后来许多传统“多线程断点续传类”软件,也增加了对的支持,…

详解虚拟机中为Linux添加硬盘

Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法,因为大多数初学者习惯使用虚拟机,这里以在Vmware虚拟机中实现Linux添加硬盘的具体步骤来详细介绍说这个问题。 Vmware中为linux增加硬盘 1. 在vmware的setting中为虚…

vue 常用功能和命令

1. vue-cli 构建项目 # 全局安装 vue-cli $ npm install --global vue-clif # 创建一个基于 webpack 模板的新项目 $ vue init webpack your-project-name # 安装依赖 $ npm install # 进入项目 $ cd your-project-name # 开发版本打包并运行 $ npm run dev# 线上环境整个项目打…

项目管理最佳实践方法_项目管理:控制项目进度最佳实践

5分钟站立会议5 MinutesStand-up Meeting(5分钟站立会议)是实践中项目进度管理的好办法。5分钟站立会议时,项目团队成员在固定时间(如每天上午8:30~8:35)、固定地点,每天站着围在一起&#xff0…

《海龟交易法则》经典梳理

序言,第一~第三章 海归交易法则序言本书是历史上最好的5本交易学著作之一的理由:1,重要的不是交易系统而是交易者贯彻交易系统的能力。2,用浅显易懂的语言阐述行为金融学的某些原理如何用于交易和影响交易。3&#xff…

Unix下C程序内存泄漏检测工具Valgrind安装与使用

Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-OReilly开源代码奖。 Valgrind遵守GNU通用公共许可证条款,是一款自由软件。 官网…

hibernate保存失败_Hibernate:保存与保存并保存或更新

hibernate保存失败save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种通过save , saveOrUpdate和persist等方法将对象保存…

BZOJ 2957 楼房重建-线段树

这个题最主要的是解决一个统计答案的问题。 首先我们注意到,只要考虑右区间的答案统计就好了。 记左区间的最大值为K,当前右区间为P。 我们把当前右区间又分成两个子区间,s1,s2。 那么如果s1的最大值比K小,那么显然只要递归处理s2…

matlab 移动平均_两所高校被禁用MATLAB背后,是工业设计能力之争

不管是MATLAB,还是EDA,都指向了中国核心工业软件缺失的问题。 作者| Decode 邮箱|oudibjoutlook.com来源丨人民数字与品玩联合出品一款工科软件,最近成为科研界议论的焦点。2020 年 6 月 6 日开始,哈尔滨工…

MySQL 当记录不存在时insert,当记录存在时update

MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法。 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (client_id, client_na…

如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

英文原文:How to Detect Memory Leaks Using Valgrind memcheck Tool for C / C 系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个…

如何在Activiti中使用瞬态变量

我们昨天发布的Activiti v6 Beta3中已经加入了一个非常需要的功能-临时变量。 在本文中,我将向您展示一个示例,该示例说明如何使用瞬态变量来覆盖一些以前不可能(或最佳)的高级用例。 到目前为止,Activiti中的所有变量…

python羊车门问题_「羊车门」经典概率题中不换门选中车的概率是多少?

今天用Python求解「羊车门」经典的概率问题,对概率学基础和Python语法的灵活运用有所收货.本次「羊车门」求解过程采用的是:穷举法计算概率已验证概率学基础理论.期间重点借鉴了奥卡姆剃刀的博客和 南葱:「羊车门」经典概率题中不换门选中车的概率是多少&#xff1f…

非标协议外设LCD1602

概述 LCD1602 ( Liquid Crystal Display )是一种工业字符型液晶,能够同时显示 1602 即 32 字符 (16 列两行) 引脚说明 第 1 脚 : VSS 为电源地 第 2 脚 : VDD 接 5V 正电源 第 3 脚 : VL 为液晶显示器对比度调整端 , 接正电源…

50: Luogu P4568 分层图

分层图最短路模板 #include <iostream> #include <cstdio> #include <cstdlib> #include <ctime> #include <queue> #include <cstring>using namespace std;const int M 2e6 5e5 10;#define gc getchar() inline int read() {int x 0…

C++编程笔记:dll的生成与使用

1.动态链接库&#xff08;dll&#xff09;概述 没接触dll之前觉得它很神秘&#xff0c;就像是一个黑盒子&#xff0c;既不能直接运行&#xff0c;也不能接收消息。它们是一些独立的文件&#xff0c;其中包含能被可执行程序或其他dll调用来完成某项工作的函数&#xff0c;只有在…

如何通过IP地址分辨公网、私网、内网、外网

如何通过IP地址分辨公网、私网、内网、外网内、外网是相对于防火墙而言的&#xff0c;在防火墙内部叫做内网&#xff0c;反之就是外网。在一定程度上外网等同于公网&#xff0c;内网等同于私网。地址为如下3个区域就是处于私网&#xff1a;1&#xff1a;10.*.*.*2&#xff1a;1…

python画动态表情包_真香!一行Python代码,帮你制作小姐姐的表情包,靠谱吗?...

原标题&#xff1a;真香&#xff01;一行Python代码&#xff0c;帮你制作小姐姐的表情包&#xff0c;靠谱吗&#xff1f;(我的IU女神)对于小姐姐的动态表情包&#xff0c;相必我们大多数人都不会拒绝&#xff0c;而且都会选择默默的将其收藏(不要问我怎么知道的)&#xff0c;一…

mongodb分片

mongodb分片&#xff1a; 本次是用三台主机搭建3个集群&#xff08;主、备、仲裁&#xff09;作为三个分片&#xff0c;一个集群&#xff08;主、备、备&#xff09;做为config服务器&#xff0c;三个mongos单点做路由&#xff0c;每台5个&#xff0c;一共15个。 新建一个mongo…