Необходимо определить ваш пользовательский фильтр предварительной проверки.
В контексте приложения безопасности в http
тэгом:
<custom-filter position="PRE_AUTH_FILTER" ref="preAuthTokenFilter" />
Затем определите фильтр боб (и его свойства approprietly):
<beans:bean class="com.yourcompany.PreAuthTokenFilter"
id="preAuthTokenFilter">
<beans:property name="authenticationDetailsSource" ref="authenticationDetailsSource" />
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="authenticationEntryPoint" ref="authenticationEntryPoint"/>
</beans:bean>
создать свой собственный фильтр простиралась от GenericFilterBean
public class PreAuthTokenFilter extends GenericFilterBean {
private AuthenticationEntryPoint authenticationEntryPoint;
private AuthenticationManager authenticationManager;
private AuthenticationDetailsSource authenticationDetailsSource = new WebAuthenticationDetailsSource();
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String token = getTokenFromHeader(request);//your method
if (StringUtils.isNotEmpty(token)) {
/* get user entity from DB by token, retrieve its username and password*/
if (isUserTokenValid(/* some args */)) {
try {
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
authRequest.setDetails(this.authenticationDetailsSource.buildDetails(request));
Authentication authResult = this.authenticationManager.authenticate(authRequest);
SecurityContextHolder.getContext().setAuthentication(authResult);
} catch (AuthenticationException e) {
}
}
}
chain.doFilter(request, response);
}
/*
other methods
*/
Если вы не хотите или не можете получить пароль, d, чтобы создать свой собственный AbstractAuthenticationToken
, который будет получать только имя пользователя, как пары (принципал) и использовать его вместо UsernamePasswordAuthenticationToken
:
public class PreAuthToken extends AbstractAuthenticationToken {
private final Object principal;
public PreAuthToken(Object principal) {
super(null);
super.setAuthenticated(true);
this.principal = principal;
}
@Override
public Object getCredentials() {
return "";
}
@Override
public Object getPrincipal() {
return principal;
}
}
Вы хотите, чтобы программно выполнить аутентификацию пользователя на основе этого маркера? –
Да, я хочу загрузить пользователя через этот токен из БД с помощью пользовательского UserDetailsService и полностью аутентифицировать его, как если бы он вступил в систему с логином/паролем –
Полностью аутентифицировать пользователя на основе URL-адреса не очень хорошая идея. Если вы просто используете его для обеспечения доступа к этому файлу, то это, вероятно, достаточно справедливо, но я был бы осторожен, если бы он позволял им делать другие вещи, которые они обычно могут делать только с полным входом в систему. –