CASはユーザー登録を実現してから自動登録します.
1.CASについての紹介はもう疲れません.SSOに関わることがあると思いますが、このフレームについては全部知っているはずです.私達が現在採用しているCAS Serverのバージョンは3.4.2.1で、CAS Cientのバージョンは3.1.10です.
CASプロジェクト公式:http://www.jasig.org/cas
CAS登録処理には、CAS CientとServer端のSTに対してSMAL認証を採用するプロセスが含まれていない.
2.登録に関する主な処理の流れ:
登録成功後->CAS登録処理を呼び出す関連モジュール->ユーザ名パスワードの検証->TGTを生成するTG->Add ST&TGTを生成し、関連するRegisterクラス->Add TGTからCookie->cas/login URLにリダイレクトします.
3. CAS登録処理のメインモジュール(クラス):
a.Credentials ユーザ登録認証情報インターフェースを記憶するために使用します.
そのデフォルトの実装クラス:org.jasig.cas.authentication.printipad.UsernamePassword Credentials
b.Central Authentication ServiceはST(Service Ticket)と TGT(TicketGranning Ticket)の認証サービス類.
そのデフォルトの実装クラス:org.jasig.cantral Authentication ServiceImpl
c.Cookie RetrievingCookie Generatorは、TGTをCookieに追加し、Cookieを管理するために使用されます.
4. 具体的な実現コード:
/**
* user register process and automatic login.
* @param userForm the user information object.
* @param request the HttpServletRequest object
* @param response the HttpServletResponse object
* @return get result view
*/
protected ModelAndView handleUserRegisterInternal(UserInfoVo userForm, HttpServletRequest request, HttpServletResponse response) {
ModelAndView signinView = new ModelAndView(REGISTER_VIEW);;
final boolean isUnique = userService.checkUserUnique(userForm.getLoginName());
final boolean isRegistered = isUnique ? registerUser(userForm, request, response) : false;
if (isRegistered) {
bindTicketGrantingTicket(userForm.getLoginName(), userForm.getLoginPassword(), request, response);
signinView.setViewName(getSignInView(request));
}
return signinView;
}
/**
* Invoke generate validate Tickets and add the TGT to cookie.
* @param loginName the user login name.
* @param loginPassword the user login password.
* @param request the HttpServletRequest object.
* @param response the HttpServletResponse object.
*/
protected void bindTicketGrantingTicket(String loginName, String loginPassword, HttpServletRequest request, HttpServletResponse response){
try {
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials();
credentials.setUsername(loginName);
credentials.setPassword(loginPassword);
String ticketGrantingTicket = centralAuthenticationService.createTicketGrantingTicket(credentials);
ticketGrantingTicketCookieGenerator.addCookie(request, response, ticketGrantingTicket);
} catch (TicketException te) {
logger.error("Validate the login name " + loginName + " failure, can't bind the TGT!", te);
} catch (Exception e){
logger.error("bindTicketGrantingTicket has exception.", e);
}
}
/**
* Get the signIn view URL.
* @param request the HttpServletRequest object.
* @return redirect URL
*/
protected String getSignInView(HttpServletRequest request) {
String service = ServletRequestUtils.getStringParameter(request, "service", "");
return ("redirect:login" + (service.length() > 0 ? "?service=" + service : ""));
}
cas-servlet.xml関連コード:
<bean id="registerController" class="com.xxxxx.sso.web.RegisterController"
p:userService-ref="userService"
p:validator-ref="registerValidator"
p:centralAuthenticationService-ref="centralAuthenticationService"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"/>
注:Central Authentication ServiceおよびticketGrantingTicketCookie Generatorについては、spring-configration/appication Contication Cotext.xmlおよびticketGrangTicketCookieGeneration.xmlにおいて宣言されています.