Spring Security3源码分析-SecurityContextHolderAwareRequestFilter分析

本文探讨了 Spring Security 中 SecurityContextHolderAwareRequestFilter 的作用,它主要负责包装请求对象,实现 Servlet API 的相关接口,如 isUserInRole 和 getRemoteUser 方法,通过这个过滤器,Spring Security 能够在应用中实现认证和授权功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SecurityContextHolderAwareRequestFilter过滤器对应的类路径为
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter

从类名称可以猜出这个过滤器主要是包装请求对象request的,看源码

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(new SecurityContextHolderAwareRequestWrapper((HttpServletRequest) req, rolePrefix), res);
}


SecurityContextHolderAwareRequestWrapper类对request包装的目的主要是实现servlet api的一些接口方法isUserInRole、getRemoteUser

//从SecurityContext中获取认证实体Authentication
private Authentication getAuthentication() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (!authenticationTrustResolver.isAnonymous(auth)) {
return auth;
}

return null;
}

//实现getRemoteUser方法。首先获取认证实体,再从认证实体中获取登录账号
@Override
public String getRemoteUser() {
Authentication auth = getAuthentication();

if ((auth == null) || (auth.getPrincipal() == null)) {
return null;
}

if (auth.getPrincipal() instanceof UserDetails) {
return ((UserDetails) auth.getPrincipal()).getUsername();
}

return auth.getPrincipal().toString();
}

//实现getUserPrincipal方法
@Override
public Principal getUserPrincipal() {
Authentication auth = getAuthentication();

if ((auth == null) || (auth.getPrincipal() == null)) {
return null;
}

return auth;
}

//判断是否授权。这里注意一下rolePrefix,就是角色的前缀
private boolean isGranted(String role) {
Authentication auth = getAuthentication();

if( rolePrefix != null ) {
role = rolePrefix + role;
}

if ((auth == null) || (auth.getPrincipal() == null)) {
return false;
}

Collection<GrantedAuthority> authorities = auth.getAuthorities();

if (authorities == null) {
return false;
}


for (GrantedAuthority grantedAuthority : authorities) {
if (role.equals(grantedAuthority.getAuthority())) {
return true;
}
}

return false;
}

//实现isUserInRole
@Override
public boolean isUserInRole(String role) {
return isGranted(role);
}


这个过滤器看起来很简单。目的仅仅是实现java ee中servlet api一些接口方法。
一些应用中直接使用getRemoteUser方法、isUserInRole方法,在使用spring security时其实就是通过这个过滤器来实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值