使用Spring Security进行预验证->;基于URL参数

使用Spring Security进行预验证->;基于URL参数,url,authentication,spring-security,Url,Authentication,Spring Security,客户希望有以下场景: 客户向webapp用户分发带有2个参数的链接(webapp地址)。基于这些变量,用户将在webapp中扮演特定角色。 我不想要任何授权。应该只进行身份验证检查,检查这些url参数是否有效,并将用户连接到适当的角色 我怎么能意识到这一点?!是否已有可用的解决方案 谢谢 关于Matthias,我解决类似情况的方法是使用servlet过滤器获取参数。我建议扩展org.springframework.web.filter.GenericFilterBean 根据这些参数,创建某种类

客户希望有以下场景:

客户向webapp用户分发带有2个参数的链接(webapp地址)。基于这些变量,用户将在webapp中扮演特定角色。 我不想要任何授权。应该只进行身份验证检查,检查这些url参数是否有效,并将用户连接到适当的角色

我怎么能意识到这一点?!是否已有可用的解决方案

谢谢


关于Matthias,我解决类似情况的方法是使用servlet过滤器获取参数。我建议扩展org.springframework.web.filter.GenericFilterBean

根据这些参数,创建某种类型的身份验证对象(如令牌),该对象可以传递到AuthenticationManager,您可以自动连接到该AuthenticationManager(或使用其他方法)


然后,您将需要一个AuthenticationProvider,它可以处理您的auth对象并生成一个UserDetails对象,该对象具有所需的GrantedAuthority集合,以满足您希望用户具有的特定角色。

我已经解决了这个问题。 对于那些感兴趣的人

web.xml


org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
上下文配置位置
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml
applicationContext.xml


applicationContext-security.xml


linkBanbiddenEntryPoint.java

公共类LinkBankeddenEntryPoint实现AuthenticationEntryPoint{
@凌驾
公共无效开始(HttpServletRequest请求,
HttpServletResponse响应,AuthenticationException(authException)
抛出IOException、ServletException{
HttpServletResponse=(HttpServletResponse)响应;
httpResponse.sendRedirect(“/rainstar2 webapp/authror.xhtml”);
}
}

UrlParametersAuthenticationFilter.java

公共类UrlParametersAuthenticationFilter扩展
AbstractPreAuthenticatedProcessingFilter{
@凌驾
受保护对象getPreAuthenticatedPrincipal(HttpServletRequest){
if(request.getParameterMap().size()==2){
返回true;
}
返回false;
}
@凌驾
受保护对象getPreAuthenticatedCredentials(HttpServletRequest){
字符串[]凭据=新字符串[2];
凭证[0]=请求.getParameter(“参数1”);
凭证[1]=request.getParameter(“param2”);
返回凭证;
}
}

UserDetailsServiceImpl.java

@SuppressWarnings(“弃用”)
公共类UserDetailsServiceImpl实现
AuthenticationUserDetailsService{
@凌驾
公共用户详细信息loadUserDetails(身份验证令牌)
抛出UsernameNotFoundException{
UserDetails UserDetails=null;
String[]凭据=(String[])标记。getPrincipal();
boolean principal=boolean.valueOf(token.getCredentials().toString());
if(凭证!=null&&principal==true){
字符串名称=凭据[0];
如果(“admin.equalsIgnoreCase(名称)){
userDetails=getAdminUser(名称);
}else if(“händler.equalsIgnoreCase(名称)){
userDetails=getRetailerUser(名称);
}else if(“user”.equalsIgnoreCase(名称)){
userDetails=getUserUser(名称);
}
}
if(userDetails==null){
抛出新的UsernameNotFoundException(“无法加载用户:”
+token.getName());
}
返回用户详细信息;
}
私有用户详细信息getAdminUser(字符串用户名){
Collection GrantedAuthories=new ArrayList();
添加(新的GrantedAuthorityImpl(“角色用户”);
添加(新的GrantedAuthorityImpl(“角色零售商”);
添加(新的GrantedAuthorityImpl(“角色管理”);
返回新用户(用户名,“notused”,true,true,true,
授权机构);
}
private UserDetails getRetailerUser(字符串用户名){
Collection GrantedAuthories=new ArrayList();
添加(新的GrantedAuthorityImpl(“角色用户”);
添加(新的GrantedAuthorityImpl(“角色零售商”);
返回新用户(用户名,“notused”,true,true,true,
授权机构);
}
私有用户详细信息getUserUser(字符串用户名){
Collection GrantedAuthories=new ArrayList();
添加(新的GrantedAuthorityImpl(“角色用户”);
返回新用户(用户名,“notused”,true,true,true,
授权机构);
}

}

我正在尝试实现您的解决方案,但我在UserDetailsServiceImpl类中的String[]credentials=(String[])token.getPrincipal()中得到了正确的结果;安装我应该得到的凭据。这篇相关的文章帮助我实现thishttps://stackoverflow.com/questions/12478589/springsecurity-custom-automatic-authentication