更改Bad credentials错误响应spring security oauth2

qf9go6mv  于 2023-05-16  发布在  Spring
关注(0)|答案(3)|浏览(314)

我有一个AuthorizationServer,它使用Spring Security的password grant_type。我正在使用这个移动的应用程序。当用户输入其用户名和密码进行登录时,如果他们是经过身份验证的用户,则应用调用令牌端点并生成令牌。这些都是由password grant_type本身处理的。对于不成功的登录,它将返回以下带有400 HTTP状态代码的一般错误。

{
  "error": "invalid_grant",
  "error_description": "Bad credentials"
}

对于我的场景,我需要自定义此错误消息。是否有办法更改此错误消息?
我试着问了一个重复的问题:Customize authentication failure response in Spring Security using AuthenticationFailureHandler,但它使用了表单Login,并且它不适用于我的实现。

pgvzfuti

pgvzfuti1#

我好几天都找不到这个问题的答案。最后,我得到了一位同事的帮助。他让我遵循这个tutorial,它对我很有效。现在我可以将默认的spring framework响应转换为我的响应模板,如下所示。

{
    "status": 400,
    "message": "Invalid username or password",
    "timestamp": "2020-06-19T10:58:29.973+00:00",
    "payload": null
 }

但是,我们仍然不知道为什么authenticationFailure处理程序不工作。希望这能帮上忙。

krugob8w

krugob8w2#

Sabin的答案是可行的,但我需要使用BadCredentialsException抛出异常,

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    private final static Logger LOGGER = LogManager.getLogger(CustomAuthenticationProvider.class);

    @Autowired
    private UserService userService;

    @Override
    public Authentication authenticate(final Authentication authentication) throws AuthenticationException{

        final String username = authentication.getName();
        final String password = authentication.getCredentials().toString();

        try {

            /* CHECKING USER CREDENTIAL */
            /* check account */
            User userDetail = userService.findByUsername(username);
            if (userDetail == null){
                throw new Exception("User not found!");
            }

            /* check password */
            String origPass = Utilities.getEncrypted(new String(Base64.decodeBase64(password)), username);
            if(!userDetail.getPassword().equals(origPass)){
                throw new Exception("Wrong username or password!");
            }
            
            /* check is active */
            if(!userDetail.getIsActive()){
                throw new Exception("User is not active!");
            }

            /* check allowance in web type */
            if(Access.isWeb()){
                if(!userDetail.getIsWeb())
                    throw new Exception("Web access prohibited!");
            }

            /* check allowance in mobile type */
            if(Access.isMobile()){
                if(!userDetail.getIsMobile())
                    throw new Exception("Mobile access prohibited!");
            }
            
            /* do some logs */
            userService.login(userDetail);

            return new UsernamePasswordAuthenticationToken(userDetail, "{noop}".concat(origPass), userDetail.getAuthorities());

        } catch (Exception e) {
            LOGGER.error("[OAUTH] Error : " + e.getLocalizedMessage());
            throw new BadCredentialsException(e.getLocalizedMessage(), e);
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }

}
eiee3dmh

eiee3dmh3#

如果您只想更改响应中的消息文本,则只需将messages.properties文件添加到应用程序的类路径中,内容如下:
AbstractUserDetailsAuthenticationProvider.badCredentials=Invalid username or password
这将导致以下响应:

{
    "error": "invalid_grant",
    "error_description": "Invalid username or password"
}

相关问题