一 Apache Shrio 是干什么的?
Apache Shiro 可以不依賴任何技術使用, 通常在企業中和Spring 結合使用
二 shrio的執行流程
三 shrio 在maven項目中如何使用
首先我們說shrio分為一下兩塊:
Authentication ,認證 ,用戶控制用戶登錄
Authorization ,授權, 用戶進行權限管理
現在我們將spring與shrio進行整合
1.創建我們的shrio模塊
2.父模塊配置
3.導入我們的依賴
4.web層導入依賴
5.web.xml中進行配置shiro的過濾器
6.創建shrio的配置application-shrio.xml文件
<bean id="shiroSecurityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.jsp" />
<property name="successUrl" value="/index.jsp" />
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<property name="filterChainDefinitions">
<value>
/css/** = anon
/demo/** = anon
/images/** = anon
/js/** = anon
/json/** = anon
/login.jsp** = anon
/index.jsp** = authc
/validatecode.jsp** = anon
/user/userAction_login** = anon
/user/userAction_validCheckCode** = anon
/** = authc // 除了上述配置 其他資源必須需要身份認證 (登陸)
</value>
</property>
</bean>
<!-- 安全管理器 -->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 在安全管理器,應該注入 Realm 連接安全數據 -->
</bean>
7.用戶身份認證編碼
第一步:修改UserAction中的login方法:
第二部:需要為SecurityManager 提供 Realm 作用: 數據源橋梁! 根據令牌對象數據(請求用戶數據) ---> Realm 獲取到令牌(賬號和密碼)!--->調用數據庫..真實用戶名和密碼,自定義Realm 繼承 AuthorizingRealm (提供 認證、授權功能 )將我們的Realm注入給安全管理器對象
第三步:
BOSRealm 實現認證方法 BOSRealm extends AuthorizingRealm 重寫doGetAuthetication方法 完成用戶身份識別認證!
注意:
因為shiro的認證失敗是拋出異常,因此,我們需要try {}catch(){}一下
8.授權:,代碼如下
@Autowired
private FacadService facadService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection collection) {
//如何進行授權,通過AuthorizationInfo進行授權
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//1.獲取當前用戶
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
//如果是超級管理員
if("123456@163.com".equalsIgnoreCase(user.getEmail())){
List<Role> roles = facadService.getRoleService().findAll();
for (Role role : roles) {
info.addRole(role.getCode());
}
List<Function> functions = facadService.getFunctionService().findAll();
for (Function function : functions) {
info.addStringPermission(function.getCode());
}
}else{
if(user!=null) {
List<Role> list =facadService.getRoleService().findRolesByUserId(user.getId());
for (Role role : list) {
String code = role.getCode();
info.addRole(code);
Set<Function> functions = role.getFunctions();
for (Function function : functions) {
info.addStringPermission(function.getCode());
}
}
}
}
return info;
}
在application-shrio.xml中
配置權限過濾如下列:
/page_base_staff** = roles["common"]