返回

开启Spring Security 之路:认证与授权,守护应用安全

后端

在上一章中,我们使用了默认的安全机制,只有一个用户和一种角色。但在实际开发中,我们往往会遇到更复杂的需求,比如:

  • 多个用户
  • 多种角色
  • 不同的权限

为了满足这些需求,我们需要对Spring Security进行更深入的配置,包括认证和授权。

认证 是指验证用户的身份,即确认用户是谁。Spring Security支持多种认证方式,包括:

  • 基于表单的认证
  • 基于HTTP Basic的认证
  • 基于JWT的认证
  • 基于OAuth2的认证

授权 是指授予用户访问特定资源的权限。Spring Security支持多种授权方式,包括:

  • 基于角色的授权
  • 基于表达式的授权
  • 基于注解的授权

认证

基于表单的认证

这是最常用的认证方式,也是Spring Security的默认认证方式。这种方式需要用户在登录页面输入用户名和密码,然后Spring Security会将这些信息与数据库中的信息进行比较,如果匹配则认为用户已通过认证。

要启用基于表单的认证,需要在Spring Security配置文件中添加以下配置:

<form-login login-page="/login" default-target-url="/home" always-use-default-target="true" />

其中:

  • login-page属性指定登录页面的URL。
  • default-target-url属性指定登录成功后跳转的URL。
  • always-use-default-target属性指定是否总是跳转到default-target-url

基于HTTP Basic的认证

这种认证方式要求用户在HTTP请求头中提供用户名和密码。这种方式通常用于API的认证。

要启用基于HTTP Basic的认证,需要在Spring Security配置文件中添加以下配置:

<http-basic />

基于JWT的认证

JWT(JSON Web Token)是一种基于JSON的认证方式,它可以将用户的相关信息(如用户名、角色等)封装成一个令牌,然后将令牌发送给客户端。客户端在每次请求资源时,都会将令牌附带在请求头中,服务端会对令牌进行验证,如果令牌有效,则认为用户已通过认证。

要启用基于JWT的认证,需要在Spring Security配置文件中添加以下配置:

<jwt />

授权

基于角色的授权

这是最简单的授权方式,这种方式只需要将用户的角色与资源的权限进行匹配即可。

要启用基于角色的授权,需要在Spring Security配置文件中添加以下配置:

<access-control>
  <role name="ADMIN" />
  <role name="USER" />
  <grant-authority role="ADMIN" authority="ROLE_ADMIN" />
  <grant-authority role="USER" authority="ROLE_USER" />
  <protect-point path="/admin/**" access="ROLE_ADMIN" />
  <protect-point path="/user/**" access="ROLE_USER" />
</access-control>

其中:

  • role元素定义了一个角色。
  • grant-authority元素将一个角色与一个权限进行关联。
  • protect-point元素定义了一个受保护的资源,只有具有指定权限的用户才能访问该资源。

基于表达式的授权

这种授权方式允许您使用表达式来定义授权规则。表达式可以使用SpEL(Spring Expression Language)来编写。

要启用基于表达式的授权,需要在Spring Security配置文件中添加以下配置:

<access-control>
  <expression-handler type="spel" />
  <protect-point path="/admin/**" access="hasRole('ROLE_ADMIN')" />
  <protect-point path="/user/**" access="hasRole('ROLE_USER')" />
</access-control>

其中:

  • expression-handler元素定义了一个表达式处理器。
  • protect-point元素定义了一个受保护的资源,只有满足表达式条件的用户才能访问该资源。

基于注解的授权

这种授权方式允许您使用注解来定义授权规则。

要启用基于注解的授权,需要在Spring Security配置文件中添加以下配置:

<global-method-security pre-post-annotations="enabled" />

然后,您可以在控制器的方法上使用@PreAuthorize@PostAuthorize注解来定义授权规则。

例如:

@Controller
public class MyController {

  @PreAuthorize("hasRole('ROLE_ADMIN')")
  @RequestMapping("/admin")
  public String admin() {
    return "admin";
  }

  @PostAuthorize("hasRole('ROLE_USER')")
  @RequestMapping("/user")
  public String user() {
    return "user";
  }
}

其中:

  • @PreAuthorize注解表示在执行方法之前进行授权检查。
  • @PostAuthorize注解表示在执行方法之后进行授权检查。

总结

认证和授权是Spring Security的核心功能,通过合理的配置,我们可以确保只有具有适当权限的用户才能访问受保护的资源,从而保护应用程序的安全。