1、基于form表單的普通登錄方式
繼承org.walkframework.shiro.realm.BaseUserRealm
~~~
public class UserRealm extends BaseUserRealm {
private Common common = SingletonFactory.getInstance(Common.class);
/**
* token支持類型定義
*
* @param token
* @return
*/
@Override
public boolean support(AuthenticationToken token) {
return token instanceof FormToken;
}
/**
* 獲取用戶認證信息
*
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetUserAuthenticationInfo(BaseToken token){
FormToken formToken = (FormToken)token;
String staffId = formToken.getUsername();
//從數據庫中獲取用戶信息
TdMStaffExt staffInfo = getUserService().findUser(staffId);
if(staffInfo == null){
log.error("未知賬戶[{}]", staffId);
throw new UnknownAccountException();
}
//從數據庫中獲取部門信息
TdMDepart departInfo = getUserService().findOrganization(staffInfo.getDepartId());
//將用戶信息設置到自定義的principal中
StaffPrincipal principal = new StaffPrincipal(formToken);
principal.setStaffId(staffInfo.getStaffId());
principal.setStaffName(staffInfo.getStaffName());
principal.setSerialNumber(staffInfo.getSerialNumber());
principal.setEparchyCode(staffInfo.getEparchyCode());
principal.setCityCode(staffInfo.getCityCode());
principal.setTeamCode(staffInfo.getTeamCode());
principal.setDepart(departInfo);
//將身份信息設置到token中
token.setPrincipal(principal);
//正常應該是取數據庫密碼staffInfo.getStaffPasswd()。此示例工程省略密碼校驗環節
//return new SimpleAuthenticationInfo(principal, staffInfo.getStaffPasswd(), getName());
return new SimpleAuthenticationInfo(principal, token.getCredentials(), getName());
}
/**
* 獲取用戶授權信息
*
* @param principals
* @return
* @throws AuthenticationException
*/
@Override
protected AuthorizationInfo doGetUserAuthorizationInfo(PrincipalCollection principals, SimpleAuthorizationInfo authorizationInfo) {
StaffPrincipal principal = (StaffPrincipal)principals.getPrimaryPrincipal();
String staffId = principal.getStaffId();
try {
//查詢用戶擁有角色列表
List<String> roles = getUserService().findRoles(staffId);
authorizationInfo.addRoles(roles);
//查詢用戶擁有權限列表
List<String> permissions = getUserService().findPermissions(staffId);
authorizationInfo.addStringPermissions(permissions);
TdMStaff staffInfo = getUserService().findUser(staffId);
//系統管理員/地州管理員/省份管理員
if ("0".equals(staffInfo.getJobCode()) || "1".equals(staffInfo.getJobCode())) {
authorizationInfo.addRole(RoleContants.EPARCHY_MANAGER);
}
//團隊長
else if ("2".equals(staffInfo.getJobCode()) && "1".equals(staffInfo.getIsTeamManager())){
authorizationInfo.addRole(RoleContants.TEAM_LEADER);
}
//客戶經理
else if ("2".equals(staffInfo.getJobCode()) && !"1".equals(staffInfo.getIsTeamManager())){
authorizationInfo.addRole(RoleContants.CUST_MANAGER);
}
} catch (Exception e) {
common.error("獲取權限信息出錯!", e);
}
return authorizationInfo;
}
}
~~~
2、基于CAS的單點登錄方式
繼承org.walkframework.shiro.realm.BaseCasRealm
~~~
public class SsoCasRealm extends BaseCasRealm {
private Common common = SingletonFactory.getInstance(Common.class);
/**
* token支持類型定義
*
* @param token
* @return
*/
@Override
public boolean support(AuthenticationToken token) {
return token instanceof CasToken;
}
/**
* 獲取用戶認證信息
*
* @param token
* @param casPrincipal
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetUserAuthenticationInfo(BaseToken token, AttributePrincipal casPrincipal) throws AuthenticationException {
//從cas服務端取得用戶身份信息
IData<String, Object> staffInfo = new DataMap<String, Object>();
staffInfo.putAll(casPrincipal.getAttributes());
//將用戶信息設置到自定義的principal中
StaffPrincipal principal = new StaffPrincipal(token);
principal.setStaffId(staffInfo.getString("STAFF_ID"));
principal.setStaffName(staffInfo.getString("STAFF_NAME"));
principal.setDepartId(staffInfo.getString("DEPART_ID"));
principal.setDepartName(staffInfo.getString("DEPART_NAME"));
principal.setDepartCode(staffInfo.getString("DEPART_CODE"));
principal.setCityId(staffInfo.getString("CITY_CODE"));
principal.setCityName(staffInfo.getString("CITY_NAME"));
principal.setAreaCode(staffInfo.getString("AREA_CODE"));
principal.setAreaName(staffInfo.getString("AREA_NAME"));
principal.setEparchyCode(staffInfo.getString("EPARCHY_CODE"));
principal.setEparchyName(staffInfo.getString("EPARCHY_NAME"));
principal.setCucDepartId(staffInfo.getString("CUC_DEPART_CODE"));
principal.setCucEparchyCode(staffInfo.getString("CUC_AREA_CODE"));
principal.setProvinceId(staffInfo.getString("PROVINCE_ID"));
principal.setProvinceCode(staffInfo.getString("PROVINCE_CODE"));
principal.setCbssCheckCode(staffInfo.getString("cbssCheckCode"));
//將身份信息設置到token中
token.setPrincipal(principal);
return new SimpleAuthenticationInfo(principal, token.getCredentials(), getName());
}
/**
* 獲取用戶授權信息
*
* @param principals
* @param authorizationInfo
* @return
* @throws AuthenticationException
*/
@Override
protected AuthorizationInfo doGetUserAuthorizationInfo(PrincipalCollection principals, SimpleAuthorizationInfo authorizationInfo) {
StaffPrincipal principal = (StaffPrincipal)principals.getPrimaryPrincipal();
String staffId = principal.getStaffId();
try {
//查詢用戶擁有角色列表
List<String> roles = getUserService().findRoles(staffId);
authorizationInfo.addRoles(roles);
//查詢用戶擁有權限列表
List<String> permissions = getUserService().findPermissions(staffId);
authorizationInfo.addStringPermissions(permissions);
} catch (Exception e) {
common.error("獲取權限信息出錯!", e);
}
return authorizationInfo;
}
}
~~~
3、基于靜默登錄的方式
繼承org.walkframework.shiro.realm.BaseSilenceLoginRealm
~~~
public class SilenceLoginRealm extends BaseSilenceLoginRealm {
@Resource(name = "loginService")
private LoginService loginService;
/**
* token支持類型定義
*
* @param token
* @return
*/
@Override
public boolean support(AuthenticationToken token) {
return token instanceof SilenceLoginToken;
}
/**
* 獲取用戶認證信息
*
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetSilenceUserAuthenticationInfo(BaseToken token){
StaffPrincipal principal = new StaffPrincipal(token);
SilenceLoginToken silenceToken = (SilenceLoginToken)token;
final String staffId = silenceToken.getUsername();
IData<String, Object> retInfo = loginService.loginWosale(staffId, null, "2");
String result = retInfo.getString("result");
if("true".equals(result)){
principal.setStaffId(staffId);
principal.setStaffName(retInfo.getString("staffName"));
principal.setEparchyCode(retInfo.getString("eparchyId"));
principal.setCityCode(retInfo.getString("cityId"));
principal.setDepartId(retInfo.getString("departId"));
principal.setDepartName(retInfo.getString("departName"));
principal.setTokenId(retInfo.getString("sessionId"));
} else {
throw new IncorrectCredentialsException(retInfo.getString("info"));
}
//將身份信息設置到token中
token.setPrincipal(principal);
return new SimpleAuthenticationInfo(principal, silenceToken.getSign(), getName());
}
/**
* 獲取用戶授權信息
*
* @param principals
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
/**
* 獲取用戶授權信息
*
* @param principals
* @return
*/
@Override
protected AuthorizationInfo doGetUserAuthorizationInfo(PrincipalCollection principals, SimpleAuthorizationInfo authorizationInfo) {
return null;
}
~~~
- walk簡介
- 核心模塊
- walk-data
- IData
- EntityHelper
- walk-cache
- 緩存管理器
- 緩存對象
- 緩存注解
- walk-batis
- 單表操作
- 批量操作
- 列表/分頁查詢
- 所有方法列表
- sql熱部署
- 二級緩存
- 數據庫方言
- 其他使用技巧
- 實體類生成工具
- walk-mq
- 隊列管理器
- 隊列對象
- 訂閱/發布管理器
- 訂閱器
- 發布器
- walk-shiro
- 用戶認證/授權
- url動態授權/回收
- 分布式會話
- 無狀態會話支持
- walk-base
- 前端基礎框架
- 公共頁面
- 自定義標簽
- 自定義函數
- 組件及工具
- 后端基礎框架
- 基礎結構
- 表單校驗
- 數據導入
- 數據導出
- 上傳下載
- 靜態參數加載器
- 靜態參數翻譯器
- 實體類翻譯器
- sql翻譯器
- 自定義翻譯器
- 靜態參數校驗器
- 分布式任務
- 增刪改查代碼生成器
- walk-restful
- 請求報文
- 返回報文
- 節點翻譯器
- api代碼生成
- walk-activiti
- 接口封裝
- 模型管理
- 流程圖展示
- 集成方法
- walk-console
- 在線會話管理
- 靜態參數表緩存管理
- 緩存管理
- 隊列管理
- 發布/訂閱管理
- walk-boot
- 常用功能
- 持久層操作
- 分布式緩存
- 分布式會話
- 分布式任務
- 前端常用功能
- 后端常用功能
- 工作流封裝
- 多數據源支持
- 關于讀寫分離
- 常用工具類
- 代碼生成工具
- SpringCloud集成
- 阿里edas平臺支持
- 其他
- 開發規約
- 環境要求
- 工程示例
- 工程結構
- web工程
- API工程
- 后臺任務
- 常見問題
- 事務不生效
- 分布式任務不生效
- 事務鎖
- 變更歷史