CAS 单点登录自定义配置

前提,搭建好 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

猜你喜欢

转载自blog.csdn.net/wjb214149306/article/details/81416002
今日推荐