屬性名 | 類型 | 默認值 | 描述 | 示例 |
bdf2.casLoginUrl | String | /cas.login.d | 當采用CAS進行SSO登錄時,設置CASServer的登錄頁面的URL地址 | bdf2.casLoginUrl=https://www.bstek.com:8443/cas-server/login |
bdf2.casServerUrl | String | /cas.server | 設置CASServer的URL地址 | bdf2.casServerUrl=https://www.bstek.com:8443/cas-server |
bdf2.casClientServerUrl | String | http://localhost:8080/bdf2-test | 設置要采用CASSSO認證的客戶端應用的地址 | bdf2.casClientServerUrl=http://localhost:8080/bdf2-test |
bdf2.logoutSuccessURL | String | /bdf2.core.view.response.LogoutSuccess.d | 主框架右上角退出系統(tǒng)快捷圖標點擊時,退出系統(tǒng)成功后跳轉的地址 ,這里設置為CASSSO的logout,表示在系統(tǒng)內部退出完成(銷毀Se ssion之類操作完成)之后,再跳轉到CASSSO的logout進行SSO的登出操作。 | bdf2.logoutSuccessURL=https://www.bstek.com:8443/cas-server/logout |
bdf2.authenticationType | String | form | 這個屬性目標支持兩個值,一個就是默認的form,表示采用BDF2系統(tǒng)提供的登錄表單登錄;另一個就是cas,表示采用CASSSO登錄。 | bdf2.authenticationType=cas |
IRetrivePreAuthenticatedUser接口源碼
package com.bstek.bdf2.core.security;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bstek.bdf2.core.business.IUser;
/**
* @author Jacky.gao
* @since 2013年7月5日
* 獲取通過其它方式已經登錄的用戶信息,比如通過SSO等
*/
public interface IRetrivePreAuthenticatedUser {
/**
*
根據給出的request與response對象,取出當前已通過其它途徑預認證的IUser對象,如果返回null表示預認證未通過
,系統(tǒng)將不會處理
* @param request
* @param response
* @return 返回已被預認證通過的IUser對象
* @throws ServletException
*/
IUser retrive(HttpServletRequest request,HttpServletResponse response) throws ServletException;
}
測試IRetrivePreAuthenticatedUser接口實現類
package test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.bstek.bdf2.core.business.IUser;
import com.bstek.bdf2.core.model.DefaultUser;
import com.bstek.bdf2.core.security.IRetrivePreAuthenticatedUser;
import com.bstek.bdf2.core.service.IDeptService;
import com.bstek.bdf2.core.service.IGroupService;
import com.bstek.bdf2.core.service.IPositionService;
@Component
public class TestRetrivePreAuthenticatedUser implements IRetrivePreAuthenticatedUser {
@Autowired
@Qualifier(IDeptService.BEAN_ID)
private IDeptService deptService;
@Autowired
@Qualifier(IPositionService.BEAN_ID)
private IPositionService positionService;
@Autowired
@Qualifier(IGroupService.BEAN_ID)
private IGroupService groupService;
public IUser retrive(HttpServletRequest request,
HttpServletResponse response) throws ServletException {
//從其它源讀取登錄信息,比如某些硬件卡中讀取登錄信息等
DefaultUser user=new DefaultUser("admin");
user.setCompanyId("bstek");
//為登錄成功的用戶設置所在部門、崗位及群組信息
user.setDepts(deptService.loadUserDepts(user.getUsername()));
user.setPositions(positionService.loadUserPositions(user.getUsername()));
user.setGroups(groupService.loadUserGroups(user.getUsername()));
//為登錄成功的用戶設置所在部門、崗位及群組信息結束
return user;
}
}
ISecurityInterceptor接口源碼
package com.bstek.bdf2.core.security;
import org.springframework.security.web.context.HttpRequestResponseHolder;
/**
* 一個供開發(fā)人員使用的在登錄、認證之前或之后或失敗后需要進行業(yè)務處理的接口,<br>
*
開發(fā)人員可以根據需要,有選擇的覆蓋該類中的某個方法,比如需要在用戶登錄前進行一些處理,那么就可覆蓋其中的
beforeLogin方法,<br>
*
依次類推,使用時,將實現類配置到spring當中即可,系統(tǒng)運行時會自動掃描該抽象類實現的存在,如果有就會加載處
理
* @author jacky.gao
* @since 2013-1-22
*/
public interface ISecurityInterceptor {
/**
* 用戶登錄系統(tǒng)之前進行的處理動作
* @param holder 一個用于包裝HttpRequest/HttpResponse的對象
*/
void beforeLogin(HttpRequestResponseHolder holder);
/**
* 用戶登錄系統(tǒng)成功之后進行的處理動作
* @param holder 一個用于包裝HttpRequest/HttpResponse的對象
*/
void loginSuccess(HttpRequestResponseHolder holder);
/**
* 用戶登錄系統(tǒng)認證失敗時需要處理的動作
* @param holder 一個用于包裝HttpRequest/HttpResponse的對象
*/
void loginFailure(HttpRequestResponseHolder holder);
/**
* 用戶在訪問系統(tǒng)資源時(比如訪問某URL),系統(tǒng)安全模塊對用戶進行授權之前需要處理的動作
* @param holder 一個用于包裝HttpRequest/HttpResponse的對象
*/
void beforeAuthorization(HttpRequestResponseHolder holder);
/**
* 用戶在訪問系統(tǒng)資源時(比如訪問某URL),系統(tǒng)安全模塊對用戶進行授權成功之后需要處理的動作
* @param holder 一個用于包裝HttpRequest/HttpResponse的對象
*/
void authorizationSuccess(HttpRequestResponseHolder holder);
/**
* 用戶在訪問系統(tǒng)資源時(比如訪問某URL或某模塊),系統(tǒng)安全模塊對用戶進行授權失敗之后需要處理的動作
* @param holder 一個用于包裝HttpRequest/HttpResponse的對象
*/
void authorizationFailure(HttpRequestResponseHolder holder);
}
DemoSecurityInterceptor類源碼
package test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.web.context.HttpRequestResponseHolder;
import org.springframework.stereotype.Component;
import com.bstek.bdf2.core.context.ContextHolder;
import com.bstek.bdf2.core.model.DefaultUser;
import com.bstek.bdf2.core.security.SecurityInterceptorAdapter;
import com.bstek.bdf2.core.service.IDeptService;
import com.bstek.bdf2.core.service.IGroupService;
import com.bstek.bdf2.core.service.IPositionService;
@Component
public class DemoSecurityInterceptor extends SecurityInterceptorAdapter {
@Autowired
@Qualifier(IDeptService.BEAN_ID)
private IDeptService deptService;
@Autowired
@Qualifier(IPositionService.BEAN_ID)
private IPositionService positionService;
@Autowired
@Qualifier(IGroupService.BEAN_ID)
private IGroupService groupService;
@Override
public void beforeAuthorization(HttpRequestResponseHolder holder) {
if(ContextHolder.getLoginUser()==null){
//表示未登錄
//從其它源讀取登錄信息,比如某些硬件卡中讀取登錄信息等
DefaultUser user=new DefaultUser("admin");
user.setCompanyId("bstek");
//為登錄成功的用戶設置所在部門、崗位及群組信息
user.setDepts(deptService.loadUserDepts(user.getUsername()));
user.setPositions(positionService.loadUserPositions(user.getUsername()));
user.setGroups(groupService.loadUserGroups(user.getUsername()));
//為登錄成功的用戶設置所在部門、崗位及群組信息結束
//這里的IUser應該是從其它源里讀取到的經過認證的合法的用戶對象,再轉換成IUser對象實例
//接下來需要將這個user對象放置到session當中及Spring Security的環(huán)境當中,以告訴系統(tǒng)已成功登錄
this.registerLoginInfo(user, holder);
}
}
}
修改后的SecurityInterceptor實現類
package test;
import org.springframework.security.web.context.HttpRequestResponseHolder;
import org.springframework.stereotype.Component;
import com.bstek.bdf2.core.context.ContextHolder;
import com.bstek.bdf2.core.security.SecurityInterceptorAdapter;
@Component
public class DemoSecurityInterceptor extends SecurityInterceptorAdapter {
@Override
public void beforeAuthorization(HttpRequestResponseHolder holder) {
if(ContextHolder.getLoginUser()==null){
//表示未登錄
String loginType=holder.getRequest().getParameter("loginType");
if(loginType!=null && loginType.equals("abc")){
throw new MyLoginException();
}
if(loginType!=null && loginType.equals("def")){
throw new MyLogin1Exception();
}
}
}
}
MyLoginException
package test;
public class MyLoginException extends RuntimeException {
}
ExceptionHandler實現類
package test;
import org.springframework.security.web.context.HttpRequestResponseHolder;
import org.springframework.stereotype.Component;
import com.bstek.bdf2.core.exception.IExceptionHandler;
@Component
public class DemoExceptionHandler implements IExceptionHandler {
public void handle(HttpRequestResponseHolder holder,
Throwable exception) {
try{
if(exception instanceof MyLoginException){
holder.getResponse().sendRedirect("/login.jsp");
}
if(exception instanceof MyLogin1Exception){
holder.getResponse().sendRedirect("/login.html");
}
}catch(Exception ex){
throw new RuntimeException(ex);
}
}
public boolean support(Throwable exception) {
return ((exception instanceof MyLoginException) || (exception instanceof MyLogin1Exception));
}
}
更多建議: