cas5.3 重写了UsernamePasswordCredential 后,rest api 401

新手上路,请多包涵

加了rest的依赖

        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-rest</artifactId>
            <version>${cas.version}</version>
        </dependency>

然后postmain调用错误如下:
image.png

找到问题应该是cas默认的rest认证只允许默认的UsernamePasswordCredential 认证,现在重定义了自己的 UsernamePasswordCaptchaCredential extends UsernamePasswordCredential
就报401,但是不知道怎么解决
代码如下:

/**
 *  * 自定义用户登入流程使用的自定义的用户凭证
 */
@Configuration("usernamePasswordCaptchaConfig")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class UsernamePasswordCaptchaConfig implements AuthenticationEventExecutionPlanConfigurer {

    @Autowired
    private CasConfigurationProperties casProperties;

    @Autowired
    @Qualifier("servicesManager")
    private ServicesManager servicesManager;

    /**
     * 用户定义用户登入处理器
     * @return
     */
    @Bean
    public AuthenticationHandler rememberMeUsernamePasswordCaptchaAuthenticationHandler() {
        UsernamePasswordCaptchaAuthenticationHandler handler = new UsernamePasswordCaptchaAuthenticationHandler(
                UsernamePasswordCaptchaAuthenticationHandler.class.getSimpleName(),
                servicesManager,
                new DefaultPrincipalFactory(),
                9);
        return handler;

    }


    @Override
    public void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) {
        plan.registerAuthenticationHandler(rememberMeUsernamePasswordCaptchaAuthenticationHandler());
    }
}
/**
 *  * 自定义用户认证核心代码
 */
public class UsernamePasswordCaptchaAuthenticationHandler extends AbstractPreAndPostProcessingAuthenticationHandler {


    @Autowired
    private UserService userService;
    @Autowired
    private ResourceService resourceService;

    public UsernamePasswordCaptchaAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) {
        super(name, servicesManager, principalFactory, order);
    }

    @Override
    protected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException {

        UsernamePasswordCaptchaCredential myCredential = (UsernamePasswordCaptchaCredential) credential;
        String requestCaptcha = myCredential.getCapcha();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        Object attribute = attributes.getRequest().getSession().getAttribute("capcha");

        String realCaptcha = attribute == null ? null : attribute.toString();

        if (StringUtils.isBlank(requestCaptcha) || !requestCaptcha.equalsIgnoreCase(realCaptcha)) {
            throw new CaptchaErrorException();
        }

//        String sysCode = myCredential.getSysCode();
//        if(StringUtils.isBlank(sysCode)){
//            throw new SysCodeNullErrorException();
//        }
//
//        Resource resource = resourceService.getValidSystemResourceBySysCode(sysCode);
//        if(null == resource){
//            throw new SysCodeNotExistException();
//        }


        User user = userService.getUserByLoginName(((UsernamePasswordCaptchaCredential) credential).getUsername());
        if(null == user){
            throw new UserCodeErrorException();
        }

        boolean passwordVerifyMD5 = MD5Utils.getSaltverifyMD5(myCredential.getPassword(),
                                                                user.getSalt(),
                                                                user.getPassword());
        if(!passwordVerifyMD5){
            throw new UserCodeErrorException();
        }

        List<MessageDescriptor> warning = new ArrayList<MessageDescriptor>();

        // 返回多属性
        Map<String, Object> map = new HashMap<>();

        return createHandlerResult(myCredential, principalFactory.createPrincipal(myCredential.getUsername(), map),
                warning);

    }

    // 判断是否支持自定义用户登入凭证
    @Override
    public boolean supports(Credential credential) {
        // TODO Auto-generated method stub
        return credential instanceof UsernamePasswordCaptchaCredential;
    }

}

在线等大佬支持。。。

阅读 4.1k
1 个回答
新手上路,请多包涵

遇到也同样的问题,看到问题还没解决,提供一个方法。

 @Override
    public boolean supports(Credential credential) {
        // TODO Auto-generated method stub
        return credential instanceof UsernamePasswordCaptchaCredential;
    }

在这里不判断类型直接返回true;

@Override
    protected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException { 
    
}

在这里判断credential的className根据名称分别进行判断,例如

String className = credential.getClass().getName();
if (className.indexOf("UsernamePasswordCaptchaCredential")>-1){
    xxx
}
else{
    xxx
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题