管理權限原理及應用
1、為什么要使用權限
1.1 安全性:誤操作、人為破壞、數據泄露等等。
1.2 數據隔離:不同的權限能看到及操作不同的數據
1.3 明確職責:運營、客服等不同角色,leader和dev等不同級別
2、怎么去實現去權限框架(三個手段,1、自定義,2、使用shiro,3、使用spring-security)
2.1 shiro
2.1.1 什么是shiro
1、Shiro 可以非常容易的開發出足夠好的應用,其不僅可以用在 JavaSE 環境,也可以用在
JavaEE 環境。Shiro 可以幫助我們完成:認證、授權、加密、會話管理、與 Web 集成、緩存等。
2、subject securityManager realm(為主要組成)
3、subject (對接外部)主體,代表了當前“用戶”,這個用戶不一定是一個具體的人,與當前應用交互的任何東西都是 Subject,如網絡爬蟲,機器人等;即一個抽象概念;所有 Subject 都綁定
到 SecurityManager,與 Subject 的所有交互都會委托給 SecurityManager;可以把 Subject 認為是一個門面;SecurityManager 才是實際的執行者;
4、securityManager組成(對接內部)
安全管理器;即所有與安全有關的操作都會與 SecurityManager 交互;
且它管理着所有 Subject;可以看出它是 Shiro 的核心,它負責與后邊介紹的其他組件進行
交互,如果學習過 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
4.1 Authentication:身份認證/登錄,驗證用戶是不是擁有相應的身份;
4.2 Authorization:授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用
戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用
戶對某個資源是否具有某個權限;
4.3 Session Manager:會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的所有信
息都在會話中;會話可以是普通 JavaSE 環境的,也可以是如 Web 環境的;
4.4 Cryptography:加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲;
4.5 Web Support:Web 支持,可以非常容易的集成到 Web 環境;
4.6 Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權限不必每次去查,
提高效率;
4.7 Concurrency:shiro 支持多線程應用的並發驗證,即如在一個線程中開啟另一個線程,能
把權限自動傳播過去;
4.8 Testing:提供測試支持;
4.9 Run As:允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
4.10 Remember Me:記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄
shiro權限框架使用
1、導入jar包
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
2、注入自定義realm對象,繼承AuthorizingRealm抽象類
2.1 自定義構造方法
super(new AllowAllCredentialsMatcher()); setAuthenticationTokenClass(UsernamePasswordToken.class); //FIXME: 暫時禁用Cache setCachingEnabled(false);
2.2 shiro設置權限
User dbUser = iUserService.findByUserName(user.getUserName()); Set<Role> roles = dbUser.getRoles(); // 獲取用戶角色 for (Role role : roles) { Set<Permission> resources = role.getResources(); for (Permission resource : resources) { shiroPermissions.add(resource.getSourceKey()); } roleSet.add(role.getRoleKey()); }
3、注入DefaultSecurityManager對象,將realm注入其中
4、設置過濾權限
// 那些不需要攔截(靜態資源) filterChainDefinitionMap.put("/assets/**", "anon"); filterChainDefinitionMap.put("/admin/login", "anon"); // 獲取相應的權限 List<Permission> list = resourceService.findAll(); for (Permission resource : list) { filterChainDefinitionMap.put(resource.getSourceUrl(), "perms[" + resource.getSourceKey() + "]"); } filterChainDefinitionMap.put("/admin/**", "authc");
實現緩存操作
@Bean(name = "shiroCacheManager") @ConditionalOnMissingBean public CacheManager cacheManager() { return new MemoryConstrainedCacheManager(); }
