apache shiro 基本架構
Subject:當前登錄人的一個安全視圖。代碼可以從對象中獲取登錄信息。
SecurityManager:架構的核心,組織管理所有的Subject。
Realms:用戶自定義,提供獲取用戶信息,認證信息。
下面是更加詳細的架構圖:
apache shiro 與Spring boot集成
spring boot starter
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.1</version>
</dependency>
通過configuration配置shiro。
@Configuration
public class ShiroConfig {
@Bean
public SecurityManager securityManager() {
return new DefaultWebSecurityManager();
}
@Bean
public ShiroSecurityRealm myRealm() {
return new ShiroSecurityRealm();
}
/**
* 配置ShiroFilterFactoryBean
*
* @param securityManager
* @return
*/
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
System.out.println("執行 ShiroFilterFactoryBean shiroFilter");
ShiroFilterFactoryBean shiroFilterFactoryBean = new
ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
shiroFilterFactoryBean.setLoginUrl("/public/login");
shiroFilterFactoryBean.setSuccessUrl("/");
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/public/**", "anon");
filterChainDefinitionMap.put("/authc/**", "authc");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public AuthorizationAttributeSourceAdvisor
authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor
= new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
}
註解
Spring中,在Controller上添加RequiresPermissions,RequiresRoles註解,從而爲接口添加訪問權限限制。
權限校驗:
@RequiresPermissions("account:create")
public void openAccount( Account acct ) {
//create the account
}
角色校驗:
@RequiresRoles( "teller" )
public void openAccount( Account acct ) {
//do something in here that only a teller //should do
}
shiro 配置
shiro有默認的實現,能夠讀取ini配置。本文沒有采用這種方式,而是直接在configuration中配置。
# =======================
# Shiro INI configuration
# =======================
[main]
# Objects and their properties are defined here,
# Such as the securityManager, Realms and anything
# else needed to build the SecurityManager
[users]
# The 'users' section is for simple deployments
# when you only need a small number of statically-defined
# set of User accounts.
[roles]
# The 'roles' section is for simple deployments
# when you only need a small number of statically-defined
# roles.
[urls]
# The 'urls' section is used for url-based security
# in web applications. We'll discuss this section in the
# Web documentation
main中配置realms以及SecurityManager。
urls中配置路徑、文件的權限。
默認Filter
Filter Name | 類 | 描述 |
---|---|---|
anon | org.apache.shiro.web.filter.authc.AnonymousFilter | 需要登錄,但不做權限校驗。 |
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter | 基於表單的驗證。對於訪問進行權限校驗。如果不通過則redirect到loginurl。 |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter | 需要用戶登錄才能繼續訪問資源。如果用戶沒有登錄,則通過要求用戶通過基本的HTTP協議進行登錄。登錄完成後,會繼續訪問之前的url。 |
logout | org.apache.shiro.web.filter.authc.LogoutFilter | 接到這個請求,會直接logout當前的subject,並重定向到配置的 redirectRUL。 |
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter | 這是一個非常有用的過濾器,可以放在任何過濾器鏈的前面,這些過濾器鏈可能會導致REST、SOAP或其他不打算參與會話的服務調用。 |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter | 如果當前用戶具有由映射值指定的權限,則允許訪問;如果用戶沒有指定的所有權限,則拒絕訪問。 |
port | org.apache.shiro.web.filter.authz.PortFilter | 要求請求位於特定端口上的篩選器,如果不是,則重定向到該端口上的相同URL。 |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter | HTTP的method(GET,POST等)轉成rest的方法(read,create等)。 |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter | 根據角色過濾 |
ssl | org.apache.shiro.web.filter.authz.SslFilter | https |
user | org.apache.shiro.web.filter.authc.UserFilter | 用戶已經登錄,或者設置了remember me。判斷條件: subject.getPrincipal() != null. |
anon
用戶需要登錄才能訪問此資源,但是不會做權限校驗。
用例:
[urls]
/user/signup/** = anon
/user/** = authc>
user/signup路徑下所有的資源登錄後都可以訪問,但是/user/目錄下其他的資源,都需要做權限校驗。
noSessionCreation
執行過程:
如果一個Subject還沒有session,那麼將會禁止對於subject.getSession() 和subject.getSession(true)的調用。如果在期間有調用,則拋出異常。
如果在filter調用之前Subject已經有Session了,或者在應用的其他地方創建了session,或者在此filter之前的filter創建了session,對於此filter沒有影響。
rest
http method 和rest 原語的映射規則。