前提,搭建好 cas 客户端与服务端
1. 服务端: cas-server-webapp-3.5.1.war
<1> 修改 spring-cnfiguration/ticketGrantingTicketCookieGenerator.xml
<!--
cookie安全模式,cookie过期时间,cookie名字,cookie path
-->
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/" />
<1> 自定义定义登录页面
复制 view/jsp/default --> view/dmalui,并修改 casLoginView.jsp,添加systemCode:
<!-- begin 修改cas 登陆页面 02.08/2018 -->
<div class="row fl-controls-left">
<select name="systemCode">
<option value="DXT">DXT</option>
<option value="ASB">ASB</option>
</select>
</div>
<!-- end 修改cas 登陆页面 02.08/2018 -->
并修改 WEB-INF/classes/default_views.properties,设置dmalui为主页目录
登录页面效果:
<2> 定义接收登录参数的凭证 和 登录验证的Handler
public class DmallCredentials extends UsernamePasswordCredentials {
private Integer id;
private String systemCode;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSystemCode() {
return systemCode;
}
public void setSystemCode(String systemCode) {
this.systemCode = systemCode;
}
}
public class DmallUsernamePasswordAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler {
@Override
protected boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials usernamePasswordCredentials)
throws AuthenticationException {
DmallCredentials dmallCredentials = (DmallCredentials) usernamePasswordCredentials;
String username = usernamePasswordCredentials.getUsername();
String password = usernamePasswordCredentials.getPassword();
String systemCode = dmallCredentials.getSystemCode();
System.out.println("systemCode:" + systemCode);
// 根据用户名取系统中用户密码
String dbPassword = UserManager.newInstance().getPasswordByUsername(username);
if (StringUtils.isNotBlank(dbPassword) && dbPassword.equals(password)) {
return true;
}
return false;
}
}
<3> 登录form表单的参数与自定义凭证的绑定:
<var name="credentials" class="com.dtdream.dmall.cas.server.DmallCredentials" />
<view-state id="viewLoginForm" view="casLoginView" model="credentials">
<binder>
<binding property="username" />
<binding property="password" />
<binding property="systemCode" /> <!-- 新加字段 -->
</binder>
<on-entry>
<set name="viewScope.commandName" value="'credentials'" />
</on-entry>
<transition on="submit" bind="true" validate="true" to="realSubmit">
<evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
</transition>
</view-state>
<4> 自定义凭证处理器,ticket检验时,返回给cas client的结果
public class DmallCredentialsResolver extends AbstractPersonDirectoryCredentialsToPrincipalResolver {
@Override
protected String extractPrincipalId(Credentials credentials) {
DmallCredentials dmallCredentials = (DmallCredentials)credentials;
String principal = dmallCredentials.getSystemCode() + ":" + dmallCredentials.getUsername();
System.out.println(principal);
return principal;
}
@Override
public boolean supports(Credentials credentials) {
return credentials instanceof DmallCredentials;
}
}
修改配置:WEB-INF/deployerConfigContext.xml
<!-- 凭证处理器, ticket检验时,返回给cas client的结果 -->
<bean class="com.dtdream.dmall.cas.server.DmallCredentialsResolver" >
<property name="attributeRepository" ref="attributeRepository" />
</bean>
2. 客户端ticket验证后凭证解析结果
Assertion assertion = AssertionHolder.getAssertion();
Assertion里面包装了 Principal