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]