实现功能
采用SpringSecurity进行用户的权限控制管理
登录检查
- 之前采用拦截器实现了登录检查,这是简单的权限管理方案,现在将其废弃。
授权配置
- 对当前系统内包含的所有的请求,分配访问权限 (普通用户、版主、管理员)
认证方案
-绕过Security认证流程,采用系统原来的认证方案
注意:
关于认证:该项目未走security的认证方式,而是走自己实现的认证方式。
在security中进行认证时,是将认证信息封装进UsernamePasswordAuthenticationToken(如果认证信息是账号密码)中 ,而security底层的filter会将token存到securityContext中。
后面对用户进行权限判断时,要从securityContext中取出认证过的授权信息 。
这里我们需要绕过security底层认证逻辑,但是还要取到用户的权限信息,所以我们提供一个获取用户权限的方法,将用户权限在存入securityContex中 。
CSRF配置
-防止 CSRF 攻击的基本原理,以及表单、AJAX相关的配置
csrf攻击是指某网站盗取用户的cookie中的凭证,冒充用户身份去访问服务器并向表单中提交数据。
发生在提交表单时,springsecurity解决方案:springsecurity在服务器向浏览器返回表单时,会返回一个隐藏的token(凭证),每次token都是随机的。
Code
首先向该项目中增加一些常量,用来赋予用户权限(写在了常量接口CommunityConstant中)
/** * 权限:普通用户 */ String AUTHORITY_USER="user"; /** * 权限:管理员 */ String AUTHORITY_ADMIN="admin"; /** * 权限:版主 */ String AUTHORITY_MODERATOR="moderator";
SecurityConfig
import com.light.community.util.CommunityConstant;
import com.light.community.util.CommunityUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.access.AccessDeniedHandler;
import javax.servlet.ServletException;
import javax.servlet.http