最近在学习springboot 及微服务框架时,在搭建项目的时候想实现登录注册的功能,在网上翻翻找找,感觉还是现在目前比较流行的Spring Security比较靠谱,所以自己尝试搭建了下。spring Security的特性,如果感兴趣可以查一查,毕竟我不是它的推广者么,只是使用者,如果你感觉它还可以,那就有必要到这里来看下了,这里只讲一下其简单的工作原理和搭建流程。
说明
在开始之前,个人首先说明下,目前使用spring Security 目前主要的2个场景, 一个是单个服务的使用session的场景,另一个是使用JWT验证的 微服务模式。在这里本人做的是基于session的验证,但是在后面会留出 JWT验证的扩展。
源码和原理----简单分析
说到Security, 我们首先会想到就是 用户的登录验证。所以先从验证这一点慢慢来进行剖析其原理。
AuthenticationManager
首先,需要讲明的是AuthenticationManager,其是认证管理器,通过源码可知他是一个接口,只对认证做了一个声明验证的方法。具体的验证方法,都交由Provider 来实现。
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
}
AuthenticationProvider
AuthenticationProvider 也是一个接口,他是最基本的接口,也定义了验证的方法,所以我们具体实现的时候只要定义一个自己的类,实现这个接口,复写一下认证方法就行了。
package org.springframework.security.authentication;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
public interface AuthenticationProvider {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
boolean supports(Class<?> authentication);
}
PS: 有人可能问,AuthenticationManager 和 AuthenticationProvider 都有认证,而且都是接口,怎么交付给Provider来验证的?源码中个人没看到,但是我试着猜想下,可能是Manager的实现类中验证方法调用了provider的 啊!
UserDetails
好吗,其实当个人创建实现AuthenticationProvider类,进行验证,其实到这就完成基本功能的一半多了。现在想一下,自己的实现类如何验证?肯定是从前段获取的数据 与 数据库存储的信息进行对比么。现在基本的开发框架中 持久层中,基本上都是ORM的了吧。 Security其实也为我们提供了一个用户的基本的接口 UserDetails。其对特定的方法做了定义:
package org.springframework.security.core.userdetails;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import java.io.Serializable;
import java.util.Collection;
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getUsername();
//下面的几个参数,怎么用自己设计
//账号是否过期
boolean isAccountNonExpired();
//账号是否被锁
boolean isAccountNonLocked();
//身份是否过期
boolean isCredentialsNonExpired();
//是否可用
boolean isEnabled();
}
UserDetailsService
有了实体类了,那就需要操纵这个实体类的 service 层了,UserDetailsService