当前位置: 首页 > 知识库问答 >
问题:

覆盖现有的Spring Security身份验证

曾丰茂
2023-03-14

因此,我需要找到一些使用ServletRequest和ServletResponse参数的身份验证方法。

但是,我仍然没有找到这样的ProcessingFilter或AuthenticationProvider。

根据Spring Security basic,我似乎必须重写与AuthenticationProvider相关的authenticate方法。

public class PreAuthenticatedAuthenticationProvider implements
        AuthenticationProvider, InitializingBean, Ordered {

    public Authentication authenticate(Authentication authentication) {}

}

谢了。

共有1个答案

毋修为
2023-03-14

我以以下方式解决了这个问题,

  • 实现自定义AbstractPreAuthenticatedProcessingFilter

重写doFilter方法

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    try { 

        // Get current Authentication object from SecurityContext
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        // Call for third party WS when the Authenticator object is null
        if (auth == null) {

            logger.debug("doFilter : Proceed the authentication"); 

            String appId = "My_APP_ID";
            String redirectURL = request.getRequestURL().toString(); 

            // Call for third party WS for get authenticate 
            if (WS_Authenticator.isAuthenticated(appId, redirectURL)) { 

                // Successfully authenticated
                logger.debug("doFilter : WS authentication success");

                // Get authenticated username 
                String userName = WS_Authenticator.getUserName();               

                // Put that username to request
                request.setAttribute("userName", userName);

            } else {

                String redirectURL = WS_Authenticator.getAuthorizedURL();
                logger.debug("doFilter : WS authentication failed");
                logger.debug("doFilter : WS redirect URL : " + redirectURL);

                ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
                ((HttpServletResponse) response).sendRedirect(redirectURL);

                // Return for bypass the filter chain 
                return;
            }   

        } else {
            logger.debug("doFilter : Already authenticated"); 
        }   

    } catch (Exception e) {
        logger.error("doFilter: " + e.getMessage());            
    }

    super.doFilter(request, response, chain);
    return;
}
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {

    // Get authenticated username
    String[] credentials = new String[1];
    credentials[0] = (String) request.getAttribute("userName");

    return credentials;
}
    null
public class CustomAuthenticationUserDetailsServiceImpl implements AuthenticationUserDetailsService<Authentication> {

    protected static final Logger logger = Logger.getLogger(CustomAuthenticationUserDetailsServiceImpl.class);

    @Autowired
    private UserDataService userDataService;

    public UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException {

        // Get authenticated username 
        String[] credentials = (String[]) token.getCredentials();
        String userName = credentials[0];

        try {

            // Get user by username
            User user = userDataService.getDetailsByUserName(userName); 

            // Get authorities username             
            List<String> roles = userDataService.getRolesByUserName(userName);          
            user.setCustomerAuthorities(roles);
            return user;

        } catch (Exception e) {
            logger.debug("loadUserDetails: User not found! " + e.getMessage());
            return null;
        }       
    }
}
 类似资料:
  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 我在我的网站中使用默认的route。php。 此路由复制的“照明/路由/路由器”。php’。 我用它来改变默认路线和。。。在 什么是?? 我应该在路线组中的何处定义它? 谢谢你的帮助。

  • 我遇到的问题与以下类型的消息有关: 因此,基本上,这是Angular JS 1.4.3前端在实际请求之前向服务器发送<code>选项 由于我无法在Angular端修复它,我认为在服务器端会很容易。会的,但我们使用Guice 4。 在 Guice 配置中,我们正确设置了 Shiro: 到目前为止一切顺利。但是现在我想在系统中打一个洞,允许< code>OPTIONS请求不被验证。我在这里发现了一个类

  • 本文向大家介绍覆盖HTML5验证,包括了覆盖HTML5验证的使用技巧和注意事项,需要的朋友参考一下 要忽略HTML验证,可以使用JavaScript删除单击按钮时的属性。 您必须从每个匹配的元素中删除一个属性。

  • 问题内容: 我一直在玩漂亮的汤和解析网页几天。在编写的所有脚本中,我一直使用一行代码作为救星。代码行是: 但是… 我想对(OPEN A URL WITH AUTHENTICATION)做同样的事情: 我无法打开网址并阅读需要身份验证的网页。我如何实现这样的目标: 问题答案: 看看官方文档中的如何使用urllib软件包获取Internet资源:

  • 我想在Docker上设置一个配置了身份验证的Cassandra容器。目前我使用的是官方的Cassandra Docker图像,但它似乎没有提供启用认证模式的选项(通过ENV thingies)。 一种可能性是设置一个自己的存储库,从Cassandra Docker GitHub克隆并修改此文件,以便它也接受与身份验证相关的选项,但对于我非常简单的任务来说,这似乎有点复杂。有没有人知道一个更简单的解