gpt4 book ai didi

spring - OAuth2 是否允许使用非密码或自定义凭据进行授权?

转载 作者:行者123 更新时间:2023-12-04 11:06:50 24 4
gpt4 key购买 nike

我正在使用 Spring Security OAuth2。客户端应用程序(我们拥有的)发出一个“密码”授权请求,传递用户的用户名和密码。就像草案规定的那样。

我需要这个机制来支持其他类型的凭证,比如卡号、PIN,甚至是预先认证的、不需要授予的密码。

请记住,这些请求只能由特权 client_id 允许,并且只能在我们拥有的应用程序中使用。

最佳答案

戴夫,感谢您的快速回复。我实际上找到了完美的解决方案,您参与了其中。它与“自定义授权” token 授予者有关... https://jira.spring.io/browse/SECOAUTH-347

如果我更新了我相当旧的 1.0.0.M5 版本,我可能已经知道这些。

我的方法是扩展 AbstractTokenGranter具有支持自定义授予类型的类(我称之为“学生卡”)。一旦身份验证请求到达这里,我就会像 ResourceOwnerPasswordTokenGranter 一样检查参数列表。 ,而是寻找我的自定义“cardNumber”参数。然后我传递了我自己的基于 id 的版本 UsernamePasswordAuthenticationToken到我的 AuthenticationProvider,它知道如何根据身份证对用户进行身份验证。

这是我想出的自定义 token 授予者类:

public class StudentCardTokenGranter extends AbstractTokenGranter {
private static final String GRANT_TYPE = "studentCard";

private final AuthenticationManager authenticationManager;

public StudentCardTokenGranter(AuthenticationManager authenticationManager,
AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService) {
super(tokenServices, clientDetailsService, GRANT_TYPE);
this.authenticationManager = authenticationManager;
}

@Override
protected OAuth2Authentication getOAuth2Authentication(AuthorizationRequest clientToken) {

Map<String, String> parameters = clientToken.getAuthorizationParameters();
String cardNumber = parameters.get("cardNumber");

Authentication userAuth = new StudentCardAuthenticationToken(cardNumber);
try {
userAuth = authenticationManager.authenticate(userAuth);
} catch (BadCredentialsException e) {
// If the username/password are wrong the spec says we should send 400/bad grant
throw new InvalidGrantException(e.getMessage());
}
if (userAuth == null || !userAuth.isAuthenticated()) {
throw new InvalidGrantException("Could not authenticate student: " + cardNumber);
}

return new OAuth2Authentication(clientToken, userAuth);
}
}

我的授权服务器配置:
<!-- Issues tokens for both client and client/user authorization requests -->
<oauth:authorization-server client-details-service-ref="clientDetails" token-services-ref="tokenServices">
<oauth:refresh-token />
<oauth:client-credentials />
<oauth:password authentication-manager-ref="myUserManager" />
<oauth:custom-grant token-granter-ref="studentCardGranter" />
</oauth:authorization-server>
<bean id="studentCardGranter" class="com.api.security.StudentCardTokenGranter">
<constructor-arg name="authenticationManager" ref="myUserManager" />
<constructor-arg name="tokenServices" ref="tokenServices" />
<constructor-arg name="clientDetailsService" ref="clientDetails" />
</bean>

关于spring - OAuth2 是否允许使用非密码或自定义凭据进行授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22637863/

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