spring security統合casシングルポイント登録コア配置及び関連javaコード


最近のプロジェクトでは、統合ポイントの登録が必要ですので、最近研究してみました。また、前の章でcasサービスの構築を紹介しました。続いてsecurity統合casは自分で測ってもいいです。ネット上にも多くの不完全なコードがあります。
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.Servitari
package 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.ローカルテストが成功しました。サーバに置いてから関連エラーを報告します。