SpringBoot集成Spring Security

本文介绍了SpringBoot集成Spring Security的实现过程,包括AuthenticationManager、AuthenticationProvider、UserDetails等核心组件的工作原理,以及配置、登录验证流程。通过示例代码展示了如何配置Spring Security,并提供了JWT验证的扩展思路。
摘要由CSDN通过智能技术生成

最近在学习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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值