gpt4 book ai didi

java - 在 Spring 中,如何通过多个参数而不仅仅是通过名称来验证用户?

转载 作者:行者123 更新时间:2023-12-01 12:23:33 27 4
gpt4 key购买 nike

我正在尝试使用 Spring Security 3.2.5 在登录时对用户进行身份验证

这是一项简单的任务,我设法找到了许多如何做到这一点的示例。我的问题是,在我的数据库中,用户是唯一的(用户名和组)。我需要向自定义 UserDetailsS​​ervice 提供这两个值才能检索用户。

有人可以指导我找到这种情况下的最佳解决方案吗?

这是我到目前为止的想法(我很困惑,如果我错了,请原谅)

  • 通过创建自定义的authenticationProvider并在authenticate方法中执行用户数据库检查。基本上,将我的 loadByUserName 实现从 MyUserDetailsS​​ervice 移至 MyAuthenticationProvider 中的身份验证方法。

    public class MyAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication)
    throws AuthenticationException {
    String name = ...
    String password = ...
    String group = ...
    ....//I am not sure how to do it though
    }

    @Override
    public boolean supports(Class<?> authentication) {
    return authentication.equals(MyUsernamePasswordGroupAuthenticationToken.class);
    }
    }
  • 可以通过将多个参数传递给 loadUserByName 来实现。我想要类似的东西

    loadUserByNameAndGroud(String name, String group)

    但我不知道如何使自定义authenticationProvider调用loadUserByNameAndGroud而不是loadUserByName

security.xml

<security:http use-expressions="true">
<security:custom-filter ref="myAuthenticationFilter" position="FORM_LOGIN_FILTER"/>
<security:intercept-url pattern="/views/login*" access="isAnonymous()"/>
<security:intercept-url pattern="/views/**" access="isAuthenticated()"/>
<security:form-login login-page="/views/login.faces"
default-target-url="/"
username-parameter="username"
password-parameter="password"/>
<security:logout logout-url="/logout" delete-cookies="JSESSIONID"/>
</security:http>

<security:authentication-manager>
<security:authentication-provider user-service-ref="myUserDetailsService" >
<security:password-encoder ref="myPasswordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>

更新[自定义过滤器]

我尝试按照 holmis83 的建议实现自定义过滤器,但出现以下异常

BeanDefinitionParsingException: Configuration problem: Filter beans '<myAuthenticationFilter>' and '<org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0>' have the same 'order' value. When using custom filters, please make sure the positions do not conflict with default filters. Alternatively you can disable the default filters by removing the corresponding child elements from <http> and avoiding the use of <http auto-config='true'>.

我添加到 security.xml 的自定义过滤器元素

<security:custom-filter ref="myAuthenticationFilter" position="FORM_LOGIN_FILTER"/>

我做错了什么?

最佳答案

正如您可能已经了解的那样,Spring Security 身份验证中没有组或域。

解决此问题的一种方法是将组名称附加到用户名后(例如使用斜杠分隔符),因此用户名内部为“用户名/组”。

如果您仍然希望用户名和组在登录表单中成为单独的字段,您可以执行如下所示的自定义身份验证过滤器来连接用户名和组:

public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
@Override
protected String obtainUsername(HttpServletRequest request) {
String username = super.obtainUsername(request);
String group = request.getParameter("group");
username += "/" + group;
return username;
}
}

然后在您的UserDetailsS​​ervice中您需要将它们分开:

public UserDetails loadUserByUsername(String username) {
int index = username.indexOf("/");
String group = username.substring(index + 1);
username = username.substring(0, index);
// find the user by username and group
}

关于java - 在 Spring 中,如何通过多个参数而不仅仅是通过名称来验证用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504267/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com