基本介绍

Spring Security 的前身是 Acegi Security,在被收纳为Spring子项目后正式更名为Spring Security。

是一个比较常用的权限框架,主要的功能是认证和授权。同时对oauth2 也有很好的支持;

认证:认证是否是本系统的用户

授权:判断已经认证了的用户是否有某个操作的权限

官网文档: https://docs.spring.io/spring-security/reference/servlet/getting-started.html

中文文档: https://www.springcloud.cc/spring-security.html#overall-architecture

快速入门

Spring Security 和springboot集成很简单,只需要引入对应的starter就可以帮助我们完成默认的配置,并且还内置表单。

  1. 新建一个springboot项目

  2. 引入springsecurity 的依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    ​ 引入此依赖会帮我们自动引入相关依赖

  1. 启动项目 观察启动日志会发现这么一行

    Using generated security password: 85df3881-0e1c-42bd-8f58-8db9bd062e53

    在系统启动的时候生成了一个密码;

    访问web访问页面,已经帮我们自动生成了一个登录页面,并对其他的操作做了拦截。

    ​ 默认的用户名为:user ,密码为日志中生成的字符;登录后即可访问;

    ​ 当然这个用户名和密码是可以配置的,这样就可以使用自定义的用户名和密码和角色了;当然这样写死的用户名和密码不适合生产环境使用。

    1
    2
    3
    4
    5
    6
    spring:
    security:
    user:
    name: zhangsan //用户名
    password: 123456 //密码
    roles: admin //角色
  2. 新建controller 访问index 后,发现通过 httpServletRequest 能获取到当然登录人的信息和权限信息;
    直接使用 httpServletRequest的 logout 方法可完成退出;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

@Controller
public class IndexController {


@RequestMapping("/index")
@ResponseBody
public String index(HttpServletRequest httpServletRequest){
String remoteUser = httpServletRequest.getRemoteUser();
Principal userPrincipal = httpServletRequest.getUserPrincipal();
boolean system = httpServletRequest.isUserInRole("SYSTEM");
System.out.println("remoteUser "+remoteUser);
System.out.println("userPrincipal "+userPrincipal);
System.out.println("isUserInRole "+system);

SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
Object principal = authentication.getPrincipal();
System.out.println("principal:"+principal);

return "true";
}


@RequestMapping("/logout")
@ResponseBody
public String logout(HttpServletRequest httpServletRequest){
try {
httpServletRequest.logout();
} catch (ServletException e) {
e.printStackTrace();
}
return "true";
}

这是因为默认与servlet Api 做了集成,实现了对应的方法;

通过SecurityContextHolder 获取 SecurityContext 可以获取当前登录人的认证和授权信息;

总结:

  1. spring boot 项目中直接引入security 的stared 就会默认为所有的请求增加认证控制,同时也提供了一个内置的登录页面。

  2. 未配置登录认证的相关的配置的时候 有一个默认的用户user 同时项目启动的时候会生成一个随机密码

  3. spring security 与servlet api 做了部分的实现;

  4. 通过 SecurityContextHolder.getContext(); 能够获取到认证后的用户的权限等信息