更新時間:2018年08月31日14時01分 來源:傳智播客 瀏覽次數(shù):
一、Shiro介紹
1、Apache Shiro是一個強大且易用的Java安全框架,執(zhí)行身份驗證、授權(quán)、密碼學(xué)和會話管理。
2、使用Shiro的易于理解的API,您可以快速、輕松地獲得任何應(yīng)用程序,從最小的移動應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序
二、Shiro體系結(jié)構(gòu)
1、 Authentication 認證 ‐‐‐‐ 用戶登錄,身份識別
2、 Authorization 授權(quán) ‐‐‐ 用戶具有哪些權(quán)限、角色
3、 Cryptography 安全數(shù)據(jù)加密
4、 Session Management 會話管理
5、 Web Integration web 系統(tǒng)集成
6、 Integrations 集成其它應(yīng)用, spring、緩存框架
三、Shiro主要運行流程
應(yīng)用程序 ‐‐‐ Subject ‐‐‐ SecurityManager ‐‐‐ Realm ‐‐‐ 安全數(shù)據(jù)(數(shù)據(jù)庫)
Subject介紹:
1、Subject 是與程序進行交互的對象,可以是人也可以是服務(wù)或者其他,通常就理解為用戶。
2、所有 Subject 實例都被綁定到(且這是必須的)一個 SecurityManager 上。當(dāng)你與一個Subject 交互時,那些交互作用轉(zhuǎn)化為與 SecurityManager 交互的特定 subject 的交互作用。
SecurityManager介紹:
1、SecurityManager 是 Shiro的核心,初始化時協(xié)調(diào)各個模塊運行。然而,一旦 SecurityManager協(xié)調(diào)完畢,SecurityManager 會被單獨留下,且我們只需要去操作Subject即可,無需操作SecurityManager 。
2、當(dāng)我們正與一個 Subject 進行交互時,實質(zhì)上是 SecurityManager在處理 Subject 安全操作。
Realm介紹:
1、Realms 擔(dān)當(dāng) Shiro 和你的應(yīng)用程序的安全數(shù)據(jù)之間的“橋梁”或“連接器”。當(dāng)它實際上與安全相關(guān)的數(shù)據(jù)如用來執(zhí)行身份驗證(登錄)及授權(quán)(訪問控制)的用戶帳戶交互時, Shiro 從一個或多個為應(yīng)用程序配置的Realm 中尋找許多這樣的東西。
2、在這個意義上說, Realm 本質(zhì)上是一個特定安全的 DAO:它封裝了數(shù)據(jù)源的連接詳細信息,使 Shiro 所需的相關(guān)的數(shù)據(jù)可用。當(dāng)配置 Shiro 時,你必須指定至少一個 Realm 用來進行身份驗證和/或授權(quán)。 SecurityManager可能配置多個 Realms,但至少有一個是必須的
四、Shiro的使用
1、 配置 web.xml,增加shiro的Filter
2、在spring配置文件中,增加shiro的相關(guān)配置
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
shiroFilter
/*
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
/login.html* = anon
/user_login.action* = anon
/validatecode.jsp* = anon
/css/** = anon
/js/** = anon
/images/** = anon
/services/** = anon
/pages/base/courier.html* = perms[courier:list]
/pages/base/area.html* = roles[base]
/** = authc
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
北京市昌平區(qū)建材城西路金燕龍辦公樓一層 電話:400-618-9090
3、編寫realm
public class BosRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@Autowired
private PermissionService permissionService;
@Override
// 授權(quán)...
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
System.out.println("shiro 授權(quán)管理...");
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 根據(jù)當(dāng)前登錄用戶 查詢對應(yīng)角色和權(quán)限
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
// 調(diào)用業(yè)務(wù)層,查詢角色
List roles = roleService.findByUser(user);
for (Role role : roles) {
authorizationInfo.addRole(role.getKeyword());
} /
/ 調(diào)用業(yè)務(wù)層,查詢權(quán)限
List permissions = permissionService.findByUser(user);
for (Permission permission : permissions) {
authorizationInfo.addStringPermission(permission.getKeyword());
} r
eturn authorizationInfo;
} @
Override
// 認證...
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
System.out.println("shiro 認證管理... ");
// 轉(zhuǎn)換token
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
// 根據(jù)用戶名 查詢 用戶信息
User user = userService.findByUsername(usernamePasswordToken
.getUsername());
if (user == null) {
// 用戶名不存在
// 參數(shù)一: 期望登錄后,保存在Subject中信息
北京市昌平區(qū)建材城西路金燕龍辦公樓一層 電話:400-618-9090
五、權(quán)限控制表結(jié)構(gòu)
// 參數(shù)二: 如果返回為null 說明用戶不存在,報用戶名
// 參數(shù)三 :realm名稱
return null;
} else {
// 用戶名存在
// 當(dāng)返回用戶密碼時,securityManager安全管理器,自動比較返回密碼和用戶輸入密碼是否
一致
// 如果密碼一致 登錄成功, 如果密碼不一致 報密碼錯誤異常
return new SimpleAuthenticationInfo(user, user.getPassword(),
getName());
}
}
}