shiro筆記
加入依賴:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
十分鐘入門:
public static void main(String[] args) {
//從ini中讀取權限信息構建SecurityManager對象
Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:my.ini");
org.apache.shiro.mgt.SecurityManager securityManager = (org.apache.shiro.mgt.SecurityManager)factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//獲取當前用戶
Subject currentUser = SecurityUtils.getSubject();
//當前用戶的回話
Session session = currentUser.getSession();
//判斷是否登錄 未登錄才需要登錄
/**
* 用戶包括兩部分
* principals and credentials
* principals(本人)表示用戶的標識信息 比如用戶名 用戶地址等
* credentials(憑證)表示用戶用於登錄的憑證 比如密碼 證書等
*/
if ( !currentUser.isAuthenticated() ) {
UsernamePasswordToken token = new UsernamePasswordToken("jiaozi", "123456");
//設置記住密碼
token.setRememberMe(true);
try {
currentUser.login( token );
System.out.println("登錄成功");
System.out.println(currentUser.isAuthenticated());
System.out.println(currentUser.isRemembered());
//檢查登錄後的用戶是否擁有某個角色
if(currentUser.hasRole("role1")){
System.out.println("是否擁有role1的角色 ");
}
if(currentUser.isPermitted("user:query:1")){
System.out.println("擁有查詢1號的權限");
}
} catch ( UnknownAccountException uae ) {
System.out.println("賬號錯誤");
} catch ( IncorrectCredentialsException ice ) {
System.out.println("密碼不匹配");
} catch ( LockedAccountException lae ) {
System.out.println("賬號被鎖定");
} catch ( AuthenticationException ae ) {
System.out.println("位置異常");
}
}
}
}
Ini配置:
1. # =======================
2. # Shiro INI configuration
3. # =======================
4.
5. [main]
6.
7. [users]
8. # 設置用戶信息
9. # 語法是 username = password, roleName1, roleName2, …, roleNameN
10. jiaozi = 123456,role1
11.
12. [roles]
13. # 角色信息和角色擁有的權限
14. #語法是 rolename = permissionDefinition1, permissionDefinition2, …, permissionDefinitionN
15. #權限的語法 * 表示所有權限 一般語法是 權限類型.權限動作.權限的資源id 比如 user:delete:1 表示擁有刪除1號用戶的權限 user:delete:*表示刪除所有用戶權限
16. admin = *
17. role1 = user:query:*, user:delete:1
18.
19. [urls]
20. # web中的url過濾
加入web程序:
加入依賴:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.4.0</version>
</dependency>
web.xml添加shiro支持的過濾器和ini文件路徑配置參數
1. <context-param>
2. <param-name>shiroConfigLocations</param-name>
3. <param-value>/WEB-INF/shiro.ini</param-value>
4. </context-param>
5. <listener>
6. <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
7. </listener>
8. <filter>
9. <filter-name>ShiroFilter</filter-name>
10. <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
11. </filter>
12. <filter-mapping>
13. <filter-name>ShiroFilter</filter-name>
14. <url-pattern>/*</url-pattern>
15. <dispatcher>REQUEST</dispatcher>
16. <dispatcher>FORWARD</dispatcher>
17. <dispatcher>INCLUDE</dispatcher>
18. <dispatcher>ERROR</dispatcher>
19. </filter-mapping>
登錄頁面:
<form action="LoginServlet" method="post">
用戶名 :<input type="text" name="userName"/>
密碼:<input type="text" name="password"/>
<input type="submit">
</form>
配置ini:
[main]
#當登陸不成功是自動跳轉到登陸頁面
authc.loginUrl=/login.html
#認證(輸入用戶名和密碼登錄)不通過 自動跳轉loginUrl
roles.loginUrl=/login.html
#授權(沒有某個角色和權限) 不通過
roles.unauthorizedUrl=/un.html
perms.loginUrl=/login.html
perms.unauthorizedUrl=/un.html
[users]
# 設置用戶信息
# 語法是 username = password, roleName1, roleName2, …, roleNameN
jiaozi = 123456,role1
[roles]
# 角色信息和角色擁有的權限
#語法是 rolename = permissionDefinition1, permissionDefinition2, …, permissionDefinitionN
#權限的語法 * 表示所有權限 一般語法是 權限類型.權限動作.權限的資源id 比如 user:delete:1 表示擁有刪除1號用戶的權限 user:delete:*表示刪除所有用戶權限
admin = *
role1 = user:query:*, user:delete:1
[urls]
# web中的url過濾 訪問這個頁面時 要求你登錄的賬號 必須擁有某些權限
/login.html = anon
/scu.jsp = perms[user:delete:2]