屬性名 | 類型 | 默認(rèn)值 | 描述 | 示例 |
bdf2.casLoginUrl | String | /cas.login.d | 當(dāng)采用CAS進(jìn)行SSO登錄時(shí),設(shè)置CASServer的登錄頁面的URL地址 | bdf2.casLoginUrl=https://www.bstek.com:8443/cas-server/login |
bdf2.casServerUrl | String | /cas.server | 設(shè)置CASServer的URL地址 | bdf2.casServerUrl=https://www.bstek.com:8443/cas-server |
bdf2.casClientServerUrl | String | http://localhost:8080/bdf2-test | 設(shè)置要采用CASSSO認(rèn)證的客戶端應(yīng)用的地址 | bdf2.casClientServerUrl=http://localhost:8080/bdf2-test |
bdf2.logoutSuccessURL | String | /bdf2.core.view.response.LogoutSuccess.d | 主框架右上角退出系統(tǒng)快捷圖標(biāo)點(diǎn)擊時(shí),退出系統(tǒng)成功后跳轉(zhuǎn)的地址 ,這里設(shè)置為CASSSO的logout,表示在系統(tǒng)內(nèi)部退出完成(銷毀Se ssion之類操作完成)之后,再跳轉(zhuǎn)到CASSSO的logout進(jìn)行SSO的登出操作。 | bdf2.logoutSuccessURL=https://www.bstek.com:8443/cas-server/logout |
bdf2.authenticationType | String | form | 這個(gè)屬性目標(biāo)支持兩個(gè)值,一個(gè)就是默認(rèn)的form,表示采用BDF2系統(tǒng)提供的登錄表單登錄;另一個(gè)就是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日
* 獲取通過其它方式已經(jīng)登錄的用戶信息,比如通過SSO等
*/
public interface IRetrivePreAuthenticatedUser {
/**
*
根據(jù)給出的request與response對(duì)象,取出當(dāng)前已通過其它途徑預(yù)認(rèn)證的IUser對(duì)象,如果返回null表示預(yù)認(rèn)證未通過
,系統(tǒng)將不會(huì)處理
* @param request
* @param response
* @return 返回已被預(yù)認(rèn)證通過的IUser對(duì)象
* @throws ServletException
*/
IUser retrive(HttpServletRequest request,HttpServletResponse response) throws ServletException;
}
測(cè)試IRetrivePreAuthenticatedUser接口實(shí)現(xiàn)類
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");
//為登錄成功的用戶設(shè)置所在部門、崗位及群組信息
user.setDepts(deptService.loadUserDepts(user.getUsername()));
user.setPositions(positionService.loadUserPositions(user.getUsername()));
user.setGroups(groupService.loadUserGroups(user.getUsername()));
//為登錄成功的用戶設(shè)置所在部門、崗位及群組信息結(jié)束
return user;
}
}
ISecurityInterceptor接口源碼
package com.bstek.bdf2.core.security;
import org.springframework.security.web.context.HttpRequestResponseHolder;
/**
* 一個(gè)供開發(fā)人員使用的在登錄、認(rèn)證之前或之后或失敗后需要進(jìn)行業(yè)務(wù)處理的接口,<br>
*
開發(fā)人員可以根據(jù)需要,有選擇的覆蓋該類中的某個(gè)方法,比如需要在用戶登錄前進(jìn)行一些處理,那么就可覆蓋其中的
beforeLogin方法,<br>
*
依次類推,使用時(shí),將實(shí)現(xiàn)類配置到spring當(dāng)中即可,系統(tǒng)運(yùn)行時(shí)會(huì)自動(dòng)掃描該抽象類實(shí)現(xiàn)的存在,如果有就會(huì)加載處
理
* @author jacky.gao
* @since 2013-1-22
*/
public interface ISecurityInterceptor {
/**
* 用戶登錄系統(tǒng)之前進(jìn)行的處理動(dòng)作
* @param holder 一個(gè)用于包裝HttpRequest/HttpResponse的對(duì)象
*/
void beforeLogin(HttpRequestResponseHolder holder);
/**
* 用戶登錄系統(tǒng)成功之后進(jìn)行的處理動(dòng)作
* @param holder 一個(gè)用于包裝HttpRequest/HttpResponse的對(duì)象
*/
void loginSuccess(HttpRequestResponseHolder holder);
/**
* 用戶登錄系統(tǒng)認(rèn)證失敗時(shí)需要處理的動(dòng)作
* @param holder 一個(gè)用于包裝HttpRequest/HttpResponse的對(duì)象
*/
void loginFailure(HttpRequestResponseHolder holder);
/**
* 用戶在訪問系統(tǒng)資源時(shí)(比如訪問某URL),系統(tǒng)安全模塊對(duì)用戶進(jìn)行授權(quán)之前需要處理的動(dòng)作
* @param holder 一個(gè)用于包裝HttpRequest/HttpResponse的對(duì)象
*/
void beforeAuthorization(HttpRequestResponseHolder holder);
/**
* 用戶在訪問系統(tǒng)資源時(shí)(比如訪問某URL),系統(tǒng)安全模塊對(duì)用戶進(jìn)行授權(quán)成功之后需要處理的動(dòng)作
* @param holder 一個(gè)用于包裝HttpRequest/HttpResponse的對(duì)象
*/
void authorizationSuccess(HttpRequestResponseHolder holder);
/**
* 用戶在訪問系統(tǒng)資源時(shí)(比如訪問某URL或某模塊),系統(tǒng)安全模塊對(duì)用戶進(jìn)行授權(quán)失敗之后需要處理的動(dòng)作
* @param holder 一個(gè)用于包裝HttpRequest/HttpResponse的對(duì)象
*/
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");
//為登錄成功的用戶設(shè)置所在部門、崗位及群組信息
user.setDepts(deptService.loadUserDepts(user.getUsername()));
user.setPositions(positionService.loadUserPositions(user.getUsername()));
user.setGroups(groupService.loadUserGroups(user.getUsername()));
//為登錄成功的用戶設(shè)置所在部門、崗位及群組信息結(jié)束
//這里的IUser應(yīng)該是從其它源里讀取到的經(jīng)過認(rèn)證的合法的用戶對(duì)象,再轉(zhuǎn)換成IUser對(duì)象實(shí)例
//接下來需要將這個(gè)user對(duì)象放置到session當(dāng)中及Spring Security的環(huán)境當(dāng)中,以告訴系統(tǒng)已成功登錄
this.registerLoginInfo(user, holder);
}
}
}
修改后的SecurityInterceptor實(shí)現(xiàn)類
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實(shí)現(xiàn)類
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));
}
}
更多建議: