建立Java项目即可。
3.1.2 引入依赖3.2 身份认证4.0.0 com.newcapec shiro01-base 1.0-SNAPSHOT 8 8 org.apache.shiro shiro-core 1.4.1 mysql mysql-connector-java 5.1.49 com.alibaba druid 1.1.10 org.slf4j slf4j-log4j12 1.7.21 junit junit 4.12 test
身份认证:用户身份识别,俗称为“用户登录”。
3.2.1 认证流程1、创建SecurityManager。
2、主体提交认证。
3、SecurityManager认证。
4、SecurityManager是用Authenticator来认证。
5、authenticator认证是通过Realm获取认证数据做最终的认证。
3.2.2 测试用例public class HelloWorldTest {
@Test
public void run(){
// 1.创建Shiro环境SecurityManager对象
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 2.创建Realm对象: SimpleAccountRealm管理账户的Realm
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
// 设置基础用户信息(相当于数据库中存储的用户信息)
simpleAccountRealm.addAccount("admin", "123");
simpleAccountRealm.addAccount("tom", "111");
// 3.设置指定Realm
securityManager.setRealm(simpleAccountRealm);
// 4.构建环境:把创建的SecurityManager和Realm告知给Shiro
SecurityUtils.setSecurityManager(securityManager);
// 5.获取当前操作的主体Subject
Subject subject = SecurityUtils.getSubject();
// 6.创建一个存储用户名与密码的令牌,用户输入用户名和密码
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "123");
// 7.登录
subject.login(usernamePasswordToken);
System.out.println("身份认证结果:" + subject.isAuthenticated());
}
}
3.2.3 认证异常
用户名提供错误时抛出的异常:
org.apache.shiro.authc.UnknownAccountException: Realm [org.apache.shiro.realm.SimpleAccountRealm@5594a1b5] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - jerry, rememberMe=false]. at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doSingleRealmAuthentication(ModularRealmAuthenticator.java:184) at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:267) at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198) at org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106) at org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:275) at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:260) at com.newcapec.HelloWorldTest.run(HelloWorldTest.java:39)
密码提供错误时抛出的异常:
org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false] did not match the expected credentials. at org.apache.shiro.realm.AuthenticatingRealm.assertCredentialsMatch(AuthenticatingRealm.java:603) at org.apache.shiro.realm.AuthenticatingRealm.getAuthenticationInfo(AuthenticatingRealm.java:581) at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doSingleRealmAuthentication(ModularRealmAuthenticator.java:180) at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:267) at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198) at org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106) at org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:275) at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:260) at com.newcapec.HelloWorldTest.run(HelloWorldTest.java:39)3.3 权限鉴定 3.3.1 鉴权流程
1、创建SecurityManager。
2、主体授权。
3、SecurityManager执行授权。
4、Authorizer执行授权。
5、Realm获取角色权限数据。
3.3.2 测试用例public class RoleTest {
@Test
public void run() {
// 1.创建Shiro环境SecurityManager对象
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 2.创建Realm对象: SimpleAccountRealm管理账户的Realm
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
// 设置基础用户信息,以及角色
simpleAccountRealm.addAccount("admin", "123", "root", "user");
simpleAccountRealm.addAccount("tom", "111", "user");
// 3.设置指定Realm
securityManager.setRealm(simpleAccountRealm);
// 4.构建环境
SecurityUtils.setSecurityManager(securityManager);
// 5.获取当前操作的主体Subject
Subject subject = SecurityUtils.getSubject();
// 6.创建一个存储用户名与密码的令牌,用户输入用户名和密码
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "123");
// 7.登录
subject.login(usernamePasswordToken);
// 判断当前用户是否身份认证成功
System.out.println("身份认证结果:" + subject.isAuthenticated());
// 判断当前用户是否用拥有指定的角色
// 方式一、subject.hasRole(角色编码); 返回值boolean类型。判断是否拥有角色。
System.out.println("是否拥有root角色:" + subject.hasRole("root"));
System.out.println("是否拥有user角色:" + subject.hasRole("user"));
// 方式二、subject.hasRoles(角色编码集合); 返回值boolean类型数组。判断是否拥有角色。其中返回数据为针对每个角色的鉴定结果。
boolean[] roles = subject.hasRoles(Arrays.asList("root", "user"));
System.out.println("是否拥有root、user角色:" + Arrays.toString(roles));
// 方式三、subject.hasAllRoles(角色编码集合); 返回值boolean类型。判断段是否拥有所有的角色。
System.out.println("是否同时拥有root、user角色:" + subject.hasAllRoles(Arrays.asList("root", "user")));
// 方式四、subject.checkRole(角色编码); 无返回值。如果拥有指定角色程序不抛出异常,否则抛出异常。
// subject.checkRole("root");
// subject.checkRole("user");
// 其他...
// 8.登出
subject.logout();
System.out.println("身份认证结果:" + subject.isAuthenticated());
System.out.println("是否拥有root角色:" + subject.hasRole("root"));
System.out.println("是否拥有user角色:" + subject.hasRole("user"));
}
}



