自定义返回信息
package com.demo.sso;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;import java.io.Serializable;
import java.util.Map;@Data
public class SSOResult implements Serializable {private static final long serialVersionUID = 758218773320954800L;/** 用户名 */@JsonProperty("id")private String username;/** 需要返回实现org.apereo.cas.authentication.principal.Principal的类名接口 */@JsonProperty("@class")private String clazz = "org.apereo.cas.authentication.principal.SimplePrincipal";/*** 其它自定义信息*/@JsonProperty("attributes")private Map<String, Object> attributes;
}
自定义账号密码认证
package com.demo.sso.handler;import com.google.common.collect.Lists;
import com.demo.sso.LoginInfo;
import com.demo.sso.SSOResult;
import com.demo.sso.exception.AuthException;
import com.demo.sso.utils.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.apereo.cas.authentication.HandlerResult;
import org.apereo.cas.authentication.PreventedException;
import org.apereo.cas.authentication.UsernamePasswordCredential;
import org.apereo.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler;
import org.apereo.cas.authentication.principal.Principal;
import org.apereo.cas.authentication.principal.PrincipalFactory;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.util.EncodingUtils;
import org.apereo.inspektr.common.web.ClientInfo;
import org.apereo.inspektr.common.web.ClientInfoHolder;import javax.security.auth.login.FailedLoginException;
import java.security.GeneralSecurityException;/*** 自定义账号密码认证handler*/
@Slf4j
public class CustomUsernamePasswordAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler {public CustomUsernamePasswordAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) {super(name, servicesManager, principalFactory, order);}@Overrideprotected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential c, String originalPassword) throws GeneralSecurityException, PreventedException {try {/*** c.getUsername():loginname 明文* c.getPassword(): Base64(Base64(password):loginType:Base64(userAgent):Base64(uuid))*/String[] info = EncodingUtils.decodeBase64ToString(c.getPassword()).split(":");ClientInfo clientInfo = ClientInfoHolder.getClientInfo();log.info("==c.getUsername:{}===ip:{}", c.getUsername(), clientInfo.getClientIpAddress());LoginInfo loginInfo = new LoginInfo();loginInfo.setLoginName(c.getUsername());loginInfo.setPassword(EncodingUtils.decodeBase64ToString(info[0]));loginInfo.setLoginType(info[1]);loginInfo.setUserAgent(info[2]);loginInfo.setUuid(EncodingUtils.decodeBase64ToString(info[3]));loginInfo.setClientIp(clientInfo.getClientIpAddress());loginInfo.setServerIp(clientInfo.getServerIpAddress());// TODO 进行自定义认证// SSOResult result = authorizeService.login(loginInfo);SSOResult result = new SSOResult();log.info("==result===" + JsonUtils.toString(result));if (result.getUsername() != null) {// 登录成功final Principal principal = this.principalFactory.createPrincipal(result.getUsername(), result.getAttributes());return createHandlerResult(c, principal, Lists.newArrayList());}} catch (AuthException authException) {throw new GeneralSecurityException(authException.getMsg());} catch (Exception e) {throw new GeneralSecurityException(e.getMessage());}throw new FailedLoginException("CustomUsernamePasswordAuthenticationHandler:" + c.getUsername());}
}
package com.demo.sso.conf;import com.demo.sso.CustomUsernamePasswordAuthenticationHandler;
import org.apereo.cas.authentication.AuthenticationEventExecutionPlan;
import org.apereo.cas.authentication.AuthenticationEventExecutionPlanConfigurer;
import org.apereo.cas.authentication.AuthenticationHandler;
import org.apereo.cas.authentication.principal.DefaultPrincipalFactory;
import org.apereo.cas.services.ServicesManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 配置类,注入自定义的账号密码认证handler*/
@Configuration
public class CustomAuthenticationEventExecutionPlanConfigurer implements AuthenticationEventExecutionPlanConfigurer {@Autowired@Qualifier("servicesManager")private ServicesManager servicesManager;@Bean@RefreshScopepublic AuthenticationHandler customUsernamePasswordAuthenticationHandler(){CustomUsernamePasswordAuthenticationHandler customUsernamePasswordAuthenticationHandler = new CustomUsernamePasswordAuthenticationHandler(CustomUsernamePasswordAuthenticationHandler.class.getSimpleName(), servicesManager, new DefaultPrincipalFactory(), 1);return customUsernamePasswordAuthenticationHandler;}@Overridepublic void configureAuthenticationExecutionPlan(AuthenticationEventExecutionPlan plan) {plan.registerAuthenticationHandler(customUsernamePasswordAuthenticationHandler());}
}