spring security統合casシングルポイント登録コア配置及び関連javaコード
16522 ワード
最近のプロジェクトでは、統合ポイントの登録が必要ですので、最近研究してみました。また、前の章でcasサービスの構築を紹介しました。続いてsecurity統合casは自分で測ってもいいです。ネット上にも多くの不完全なコードがあります。
1.web.xml設定
過程の中でビルの主な主人は以下のいくつかの問題に出会いました。
1.asサービス端末の登録が成功した後、ページはクライアントに許可されていないことを提示します。
2.casサービス端末のログインが成功した後、クライアントはユーザ名を取得できません。
3.クライアントがユーザ名を取得したら以下のエラーを提示します。
HTTP Stuts 500-javax.net.ssl.SSLHandschake Exception:java.security.cert.CertificateException:No subject alternative names present
4.ローカルテストが成功しました。サーバに置いてから関連エラーを報告します。
1.web.xml設定
kun-web
contextConfigLocation
classpath:webApplication.xml,classpath:application.xml,classpath:applicationContext-security-cas.xml
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
true
encoding
UTF-8
encodingFilter
/*
kun_DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
kun_DispatcherServlet
/
cn.com.wavenet.hydro.servlet.listener.GlobalRequestListener
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
log4jConfigLocation
classpath:log4j.properties
30
/home
2.コアappication Contect-security-cas.xml構成
3.cas.propertiesファイル#cas
#cas.server.url=https://localhost:8090/cas
#cas
#cas.server.loginUrl=https://localhost:8090/cas/login
# , http ,http https cas ,
cas.server.url=http://172.84.99.=2:8767/cas
cas.server.loginUrl=http://1724.4.4=1.=4:8767/cas/login
# , false
cas.server.renew=false
#
casClientRoot=http://localhost:8080/kun-web
4.核心java類UserDetails Serviceは、多くのところでorg.spring frame ebork.security.com.userdetails.UserDetails.UserDetails Serviceを実現しています。これは実際には間違っていません。単独で登録しない場合に実現するのは間違いないですが、統合casの後、org.spristthevitarystorication.spristorication.spristorication.Serderstrace.Serderstrace.Serfrance.Serfrance.Servitarise.Servitaripackage cn.com.wavenet.security.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Repository;
import cn.com.wavenet.hydro.dao.ResourceDao;
import cn.com.wavenet.hydro.dao.UsersDao;
import cn.com.wavenet.hydro.pojo.Resources;
import cn.com.wavenet.hydro.pojo.Users;
import cn.com.wavenet.security.filter.WavenetUser;
@Repository("cn.com.wavenet.security.service.UserDetailsService")
public class UserDetailsService implements AuthenticationUserDetailsService {
private static final Logger logger = Logger.getLogger(UserDetailsService.class);
@Resource
ResourceDao resourceDao;
@Resource
UsersDao wsurepos;
@Resource
WavenetResourceService wavenetResourceServiceImpl;
@Override
public UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException {
List auths = new ArrayList();
CasAssertionAuthenticationToken casauth = null;
if (token instanceof CasAssertionAuthenticationToken) {
casauth = (CasAssertionAuthenticationToken) token;
Map attr = casauth.getAssertion().getPrincipal()
.getAttributes();
String username = attr.get("st_lgnm").toString();
if(username == null || username=="" || username.equals("")) {
String message = " :["+username +"] ";
logger.error(message);
throw new UsernameNotFoundException(message);
}
Users users = wsurepos.findByStLgnm(username);
//h
Collection grantedAuths = obtionGrantedAuthorities(users);
List resourceList = resourceDao.getUserResourceByLgnm(username);
boolean enables = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
WavenetUser userdetail = new WavenetUser(users.getStLgnm(), users.getStLgps(), enables, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuths);
//org.springframework.security.core.userdetails.User user = new
//UserDetails userdetail = new
userdetail.setUsercode(users.getCdUs());
userdetail.setResourceList(resourceList);
Users nuser = new Users();
nuser.setCdUs(users.getCdUs());
nuser.setStAreaid(users.getStAreaid());
nuser.setStName(users.getStName());
userdetail.setUsers(nuser);
return userdetail;
}
return null;
}
//
private Set obtionGrantedAuthorities(Users user) {
Set authSet = new HashSet();
List resources =wavenetResourceServiceImpl.getUserResourceByLgnm(user.getStLgnm());
for(Resources resource : resources) {
if (logger.isDebugEnabled()) {
logger.debug(" :[" + user.getStLgnm() + "] :["
+ resource.getStAph() + "], spring security access");
}
try {
if(null==resource || null==resource.getStAph()){
continue;
}
authSet.add(new SimpleGrantedAuthority(resource.getStAph()));
} catch (Exception e) {
e.printStackTrace();
System.out.println("="+e.getMessage());
}
}
if (logger.isDebugEnabled()) {
logger.debug("loadUserByUsername(String) - end");
}
return authSet;
}
}
5.casではないプロファイルを比較してみてください。
核心コードは全部完成したとしても、後期は時間を作ってソースコードを補充します。過程の中でビルの主な主人は以下のいくつかの問題に出会いました。
1.asサービス端末の登録が成功した後、ページはクライアントに許可されていないことを提示します。
2.casサービス端末のログインが成功した後、クライアントはユーザ名を取得できません。
3.クライアントがユーザ名を取得したら以下のエラーを提示します。
HTTP Stuts 500-javax.net.ssl.SSLHandschake Exception:java.security.cert.CertificateException:No subject alternative names present
4.ローカルテストが成功しました。サーバに置いてから関連エラーを報告します。