Spring Security

印象笔记:Spring Security
图片无法上传至简书,可以阅读上面的文章。

Spring Security

前言:
利用gradle工具来构建一个项目 springboot项目,同时利用Spring Security安全框架,来做权限安全验证。
在网上,看到更多的示例是关于maven项目+Spring boot+Spring Security的结合。索性自己写一个教程。
我希望你,能够在搭建项目之前了解以下内容:

  • Gradle构建工具
  • SpringBoot 的应用
  • Intellij IDEA 工具的使用

其中踩到不少坑,浪费了很多的时间来,解决这些问题。希望这篇文档能给你带来 帮助。

一、 创建一个Gradle项目

步骤:
[图片上传失败...(image-41962d-1534468591386)]
[图片上传失败...(image-3b2ef3-1534468591387)]
[图片上传失败...(image-b53c71-1534468591387)]
然后一路next,最终finally。
最终项目初始结构:

[图片上传失败...(image-53b0e8-1534468591387)]
注意:Idea创建gradle项目,不能够自动创建src源码包,需要自己手动创建。
我在这里写了两个任务,放到build.gradle中执行,可以自动创建src,test包。


def creatDir={
path ->
File dir =new File(path);
if(!dir.exists()){
dir.mkdirs();
}
}

task makeJavaDir() {
def paths = ['src/main/java', 'src/main/resources', 'src/test/java', 'src/test/resources'];
// 在创建任务之前 先遍历 路径
doFirst {
paths.forEach(creatDir);
}
}

// web 项目目录结构 包含了java项目目录结构
task makeWebDir(){
dependsOn 'makeJavaDir';
def paths=['src/main/webapp','src/test/webapp'];
doLast {
paths.forEach(creatDir)
}
}


在Tasks-->other中便能找到这两个任务,选中执行即可。
[图片上传失败...(image-f7d83b-1534468591387)]

运行完之后的项目结构:
[图片上传失败...(image-bfab13-1534468591387)]

再次刷新 依赖导入,如下图效果,即搭建gradle项目成功了。
[图片上传失败...(image-53bfcb-1534468591387)]


二、启动一个springBoot 项目

1、重写 build.gradle文件
主要是配置项目的信息。
buildscript中配置都是gradle自身的配置。


buildscript {
     ext {
        springBootVersion = '2.0.3.RELEASE'
        projectJdk = '1.8'
        projectGroup = 'com.security'
        projectVersion = '0.0.1'
        projectName = 'securitydemo'
        // 注意 mavenUrl一行  可以省略
        mavenUrl =  "http://192.168.0.14/nexus/repository/maven-public/";
    }
    repositories {
        mavenLocal()
         // 注意 maven 一行 可以省略
        maven { url = mavenUrl }
        mavenCentral();
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}
// 以下配置为项目的自身配置
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'war'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven-publish'

group = projectGroup
version = projectVersion
sourceCompatibility = projectJdk
repositories {
    mavenLocal()
      // 注意 maven 一行 可以省略  ,换为   mavenCentral();
    maven { url = mavenUrl }
}
dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-aop')
    compile("org.apache.tomcat.embed:tomcat-embed-jasper")
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    // spring-security 依赖 暂时注释掉
//    compile('org.springframework.boot:spring-boot-starter-security')

 //   compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity4', version: '3.0.2.RELEASE'

    compile('com.alibaba:druid-spring-boot-starter:1.1.10')
    compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2")
    compile("mysql:mysql-connector-java:8.0.11")
    compile("com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5")
    compile("org.springframework.boot:spring-boot-devtools")
    compile("tk.mybatis:mapper-spring-boot-starter:2.0.3")
    compile("org.mybatis.generator:mybatis-generator-core:1.3.7")

    compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
    compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
    compile 'com.github.joschi.jackson:jackson-datatype-threetenbp:2.6.4'

    compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.6'


    compile ('org.springframework.social:spring-social-web:1.1.0.RELEASE')
}

2、创建com.security包,并在包下创建SpringBootApplcationDemo类。
之后便启动这个类。
[图片上传失败...(image-897292-1534468591387)]

**清单一 **:创建SpringBootApplcationDemo

@SpringBootApplication
public class SpringBootApplicationDemo {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplicationDemo.class,args);
    }
}

3、在com.security包下创建controller包,并在其下,创建HelloController类。

清单二:创建HelloController


@RestController
public class HelloController {
    @GetMapping("/")
    public  String index(){
        return "Hello world!";
    }
}

4、 启动SpringBootApplcationDemo类,浏览器中输入:localhost:8080/,看到Hello world!便搭建springboot+gradle成功了。

[图片上传失败...(image-12ad3-1534468591387)]


三、 结合SpirngSecurity 做一个安全登录

1、在build.gradle中导入Spring Security相关依赖。

注意是在项目中的dependencies中导入下面的依赖,不是在buildscript中的dependencies中导入

清单三:导入依赖spring-security:5.0.7.RELEAS 。


 // 导入spring security的依赖
    compile 'org.springframework.security:spring-security-web:5.0.7.RELEASE'
    compile 'org.springframework.security:spring-security-config:5.0.7.RELEASE'

可能会报,无法正确配置,无法解析jar包
[图片上传失败...(image-5bff8a-1534468591387)]

我实验后的结果是不好用的。于是便换了 依赖
清单四:spring security的依赖


    // 导入spring security的依赖
    compile('org.springframework.boot:spring-boot-starter-security')
    compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity4', version: '3.0.2.RELEASE'

这时候在导入依赖,编译能够成功。启动项目,访问localhost:8080/ 发现,被成功拦截了,显示的是spring-Security自带的登录界面。不在是第二大步springboot启动的结果 显示hello world!了。
[图片上传失败...(image-9ac96a-1534468591387)]

这时候便面临着一个登录问题,我们去控制台上会发现启动的时候生成了一串md5的密码
!springSecurity随机生成的密码](./1534386377356.png)。
这时候可以将密码输入,用户名随便输入。
我显示的结果为
[图片上传失败...(image-29a6e8-1534468591387)]

2、Web Security java配置及自定义登录密码

MyUserDetailsService 用来自定义用信息:设置密码,权限,账号状态等。
WebSecurityConfig 负责应用程序内的所有安全性(保护应用程序URL,验证提交的用户名和密码等等)
com.security包下创建conf包,再在其中分别创建MyUserDetailsService类和WebSecurityConfig类。

a) .创建 WebSecurityConfig类,来继承 WebSecurityConfigurerAdapter类。

在其中的类中 alt+insert 快捷键 导入父类的方法,进行重写。
[图片上传失败...(image-35985a-1534468591387)]
清单五:WebSecurityConfig

@EnableWebSecurity
public class WebSecurityConfig  extends WebSecurityConfigurerAdapter {
    // 覆盖默认的configure(HttpSecurity http) 配置
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated();
    }

    // 密码 编码
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

b) .创建MyUserDetailsService类,来实现 UserDetailsService 接口。

清单六:MyUserDetailsService,定义用户基本信息。


@Component
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        String password=passwordEncoder.encode("123456");
        return new User(username,password,AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}

3、启动springboot 。在浏览器中变显示了登录界面。用户名随便输入,密码为123456 。登录成功变现实了Hello world!

[图片上传失败...(image-622cce-1534468591387)]
一个简单的springsecurity 示例,实验成功!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容