当你看到这篇文章时,我猜你肯定是碰到令人苦恼的问题了,我希望本文能让你有所收获。

本人几个月前还是 Spring 小白,几个月走来,看了 Spring,Spring boot,到这次的 Spring Security。

为了避免大家踩坑,本人将入门的经验传授给那些和我一样正在学习 Spring Security 的小白。

我们从官方例子学习起:

1、我们先来创建一个 Spring Boot 的项目 HelloWorld:

  我用的开发工具是 eclipse,如果没装 STS 的话,请点击 Help -> Eclipse MarketPlace...

  

2、点击 File -> New -> Spring Starter Project。

  然后我们根据需要进行选择,如图所示:

        

3、项目创建好后的目录如图所示:

  

4、接下来我们新建一个包,取名为 security.config,再在包下建一个类并使其继承 WebSecurityConfigurerAdapter。

5、这样就已经可以生成 jar 啦,我们右键项目 Run as -> Maven Build...  然后 Debug,就会在 target 目录下生成 jar 。

6、右键生成的 jar,点击属性后会看到它的文件位置,我们在控制台运行它:

  java -jar C:\Users\Anonymous\eclipse-workspace\HelloWorld\target\HelloWorld-0.0.1-SNAPSHOT.jar

  再在浏览器输入 http://localhost:8080/ 就会出现一个登录页面。

  用户名为 user,密码在控制台可找到: Using generated security password: 254f14b9-a3e4-4dd5-9888-4c46b0c27e3f

  输入进去就会出现如下图片:

  

7、让我们从头回顾一下,我们干了啥!我们仅仅在 security 包下创建了一个 config 子包。

   然后在该子包里创建了一个类并让它继承 WebSecurityConfigurerAdapter 类,并在类上加了一个注解 @EnableWebSecurity。

   我们打开 HelloWorldApplication 类,可以看到 main() 函数里只一行代码:

   SpringApplication.run(HelloWorldApplication.class, args);  其实这一行代码的作用总的来说是加载整个项目的意思。

   在这个类上方有个 @SpringBootApplication 注解,我们将鼠标放在上面可以看到该注解是由一系列注解组成的。

   我们可以把这个类比作一个树的根,所有其他的配置都需要以它为基础而展开,所以项目其他的包应该都是它的子包。

8、我们再看看自己创建的类 WebSecurityConfig,这个类的 @EnableWebSecurity 注解会启用 Web 安全功能。

   但是它本身并没有什么用处,Spring Security 必须配置在一个实现了 WebSecurityConfigurer 的 bean 中,

   或者(简单起见)扩展 WebSecurityConfigurerAdapter。

9、好啦,最基础的就是这些啦,让我们来实现一下让它打印 HelloWorld!

   在配置类中我们写上如下代码:

package security.config;

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; @EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Auto-generated method stub
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().defaultSuccessUrl("/hello");
}
}

10、再在控制器类中写上如下代码:

package security.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class HelloController { @GetMapping("/hello")
public String hello() {
return "Hello World";
}
}

11、好啦,大功告成,代码已经可以运行啦。现在我们来了解一下它们。

  在 WebSecurityConfig 类中我们重写了 configure(HttpSecurity http) 方法,这个方法是完成用户授权的。

  还有另外一个 configure(AuthenticationManagerBuilder auth) 方法,这个方法是完成用户认证的。

  暂时我们只了解第一个,第二个我们在(二) 中了解。

  以下内容摘自 《Spring Boot2 企业应用实战》:HttpSecurity 的 authorizeRequests() 方法有多个子节点。

  其中每个 matcher 按照它们的声明顺序执行,指定用户可以访问的多个 URL 模式。

  Ⅰ、antMatchers 使用 Ant 风格匹配路径。

  Ⅱ、regexMatchers 使用正则表达式匹配路径。

  在匹配了请求路径后,可以针对当前用户的信息对请求路径进行安全处理。

方法 用途
anyRequest 匹配所有请求路径
access(String) Spring EL 表达式结果为 true 时可以访问
anonymous() 匿名可以访问
denyAll() 用户不能访问
fullyAuthenticated() 用户完全认证可以访问(非 remember-me 下自动登录)
hasAnyAuthority(String...) 如果有参数,参数表示权限,则其中任何一个权限可以访问
hasAnyRole(String...) 如果有参数,参数表示角色,则其中任何一个角色可以访问
hasAuthority(String...) 如果有参数,参数表示权限,则其权限可以访问
hasIpAdress(String...) 如果有参数,参数表示 IP 地址,如果用户 IP 和参数匹配,则可以访问
hasRole(String...) 如果有参数,参数表示角色,则其角色可以访问
permitAll() 用户可以任意访问
rememberMe() 允许通过 remember-me 登录的用户访问
authenticated() 用户登录后可访问

12、现在我们读一下代码的意思:授权请求的路径为 "/login" 时,用户可以任意访问。

  其他匹配所有请求的路径都需要授权才能访问。.and() 是再从 http 参数开始。

  举个例子:.and().formLogin() 相当于 http.formLogin()。

  formLogin():开始设置登录操作。defaultSuccessUrl("/hello"): 指定登录成功后转向的页面。

  另外还有其他的方法,我们在(二)再了解。控制类中的代码是常见的代码,就不说了。

13、代码写完了,我们在控制台运行一下,再在浏览器输入:http://localhost:8080/login:

  登录后,就可以看到 Hello World!

14、运行结果如上图所示,市面上有些书说输入 http://localhost:8080/ 就会自动跳转的 login 页面。

  这的确没错,但是当我们输入用户名密码后,会进入到 error 页面。这是为什么呢?

  这是因为 "/" (空)请求需要用户认证,而又没有设置 "/" (空)请求可以任意访问,所以跳转到 login 页面进行认证。

  认证成功后,控制类中并没有对 "/" 空请求的处理。所以这将导致出现错误页面。

  注意这是一个大坑,坑了我好几天了。

15、最后,上面的例子仅仅是一个简单的入门例子,我们更常用的是自定义登录页面,并且用户名和密码都是从数据库读取来认证的。

  这一部分内容将在(二)中讲解。

16、如果这篇文章帮助了你,请给我点个赞哦!方便的话关注一下哒!

Spring Security 入门(一)的更多相关文章

  1. SpringBoot集成Spring Security入门体验

    一.前言 Spring Security 和 Apache Shiro 都是安全框架,为Java应用程序提供身份认证和授权. 二者区别 Spring Security:重量级安全框架 Apache S ...

  2. Spring Security 入门(基本使用)

    Spring Security 入门(基本使用) 这几天看了下b站关于 spring security 的学习视频,不得不说 spring security 有点复杂,脑袋有点懵懵的,在此整理下学习内 ...

  3. Spring Security 入门(1-1)Spring Security是什么?

    1.Spring Security是什么? Spring Security 是一个安全框架,前身是 Acegi Security , 能够为 Spring企业应用系统提供声明式的安全访问控制. Spr ...

  4. Spring Security 入门

    一.Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配 ...

  5. Spring Security 入门 (二)

    我们在篇(一)中已经谈到了默认的登录页面以及默认的登录账号和密码. 在这一篇中我们将自己定义登录页面及账号密码. 我们先从简单的开始吧:设置自定义的账号和密码(并非从数据库读取),虽然意义不大. 上一 ...

  6. Spring Security 入门—内存用户验证

    简介 作为 Spring 全家桶组件之一,Spring Security 是一个提供安全机制的组件,它主要解决两个问题: 认证:验证用户名和密码: 授权:对于不同的 URL 权限不一样,只有当认证的用 ...

  7. 030 SSM综合练习06--数据后台管理系统--SSM权限操作及Spring Security入门

    1.权限操作涉及的三张表 (1)用户表信息描述users sql语句: CREATE TABLE users ( id ) DEFAULT SYS_GUID () PRIMARY KEY, email ...

  8. Spring Security 入门详解(转)

    1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完整的安全性解决方案,能够在web请求级别和方法调用级别 处理 ...

  9. Spring Security入门(1-13)Spring Security的投票机制和投票器

    1.三种表决方式,默认是 一票制AffirmativeBased public interface AccessDecisionManager { /** * 通过传递的参数来决定用户是否有访问对应受 ...

随机推荐

  1. Unity3D_06_根据Transform、GameObject和Tag获取子对象集合

    导引: 因为项目中难免要多次进行获取子对象或者子对象的集合,所以写一个单独的类,用来做这些操作.然后再实际的项目中,只需要使用 transform 或者 gameobject 调用这些方法就可以快速的 ...

  2. Java反序列化漏洞原理解析(案例未完善后续补充)

    序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 java的反序列化 序列化就是将对象转换为流,利于储存和传输的格式 反序列化与序列化相反,将流转换为对象 例如:json序列化.XML序列 ...

  3. Python中使用pip安装库时提示:远程主机强迫关闭了一个现有的连接

    场景 在cmd中使用pip install moviepy时,需要安装一些依赖库,很长时间后提示: 远程主机中断了一个现有的连接. 原因是默认镜像源下载过慢,将其修改为国内或者设置安装时的源. 这里以 ...

  4. 将dos格式文件转换为unix格式

    在windows下换行符是\r\n,表示回到行首并换到下一行 而unix系统中换行符是\n 这样就存在一个问题,在windows上的文档到了unix上可能就无法使用了 针对这个情况有几种解决办法: 1 ...

  5. DOM盒子模型常用属性client,offset和scroll

    JS盒子模型属性 在JS中通过相关的属性可以获取(设置)元素的样式信息,这些属性就是盒子模型属性(基本上都是有关于样式的) 属性 值 client top/left/width/height offs ...

  6. 渐进深入理解Nginx

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 之前其实写过一篇文章具体介绍过:最基础的Nginx教学,当时有提到过Nginx有一个重要的功能:负载均衡.所以 ...

  7. elasticsearch Discovery 发现模块学习

    发现模块和集群的形成 目标 发现节点 Master选举 组成集群,在Master信息发生变化时及时更新. 故障检测 细分为几个子模块 Discovery发现模块 Discover是在集群Master节 ...

  8. HBase导入数据同时与Phoenix实现同步映射

    1.HDFS上数据准备 2019-03-24 09:21:57.347,869454021315519,8,1 2019-03-24 22:07:15.513,867789020387791,8,1 ...

  9. 在64系统里执行32位程序出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

    安装下glic即可 sudo yum install glibc.i686

  10. Linux入门基础之 下

    八.Linux 管道.重定向及文本处理 8.1.Linux 多命令协作:管道及重定向 8.1.1 开源文化 开源文化的核心理念之一就是不要重复发明轮子,很多的开源软件都是现有软件.代码.功能的重新组合 ...