1、使用shiro框架来完成认证工作,默认情况下使用的是IniRealm。如果需要使用其他Realm,那么需要进行相关的配置。
2、ini配置文件讲解:
[main] section是你配置应用程序的SecurityManager实例及任何它的依赖组件(如Realms)的地方。
[main]
myRealm=cn.sun.realm.MyRealm
#依赖注入
securityManager.realm=$myRealm
[users] section允许你定义一组静态的用户账户。在这大部分拥有少数用户账户或用户账户不需要运行时被动态地创建的环境下是很有用的。
[users]
zhangsan=1111
lisi=2222,role1,role2
[roles] section允许你把定义在[users] section中的角色与权限关联起来。另外,这在大部分拥有少数用户账户或用户账户不需要再运行时被动态地创建的环境下是很有用的。
[users]
zhangsan=1111,role1
[roles]
role1=user:add,user:delete
3、使用JdbcRealm来完成身份认证
通过观察JdbcRealm可知,要实现JdbcRealm:
(1)需要为jdbcRealm设置dataSource
(2)在指定的dataSource所对应的数据库中应有用户表users,该表中应该有username,password,password_salt等
4、实现步骤
(1)新建数据库表
(2)配置shiro.ini文件
1 [main] 2 #配置数据源 3 dataSource=com.alibaba.druid.pool.DruidDataSource 4 dataSource.url=jdbc:mysql://127.0.0.1:3306/shiro?serverTimezone=GMT%2B8 5 dataSource.driverClassName=com.mysql.cj.jdbc.Driver 6 dataSource.username=root 7 dataSource.password=root 8 jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm 9 # $表示引用对象 10 jdbcRealm.dataSource=$dataSource 11 securityManager.realm=$jdbcRealm
说明:特别要注意连接池配置关键字:url,driverClassName,username,password
(3)测试
JdbcDemo.java
1 package com.sun123.shiro; 2 3 import org.apache.shiro.SecurityUtils; 4 import org.apache.shiro.authc.IncorrectCredentialsException; 5 import org.apache.shiro.authc.UnknownAccountException; 6 import org.apache.shiro.authc.UsernamePasswordToken; 7 import org.apache.shiro.config.IniSecurityManagerFactory; 8 import org.apache.shiro.util.Factory; 9 //java.lang中有SecurityManager的包,需要改成Apache的 10 import org.apache.shiro.mgt.SecurityManager; 11 import org.apache.shiro.subject.Subject; 12 13 public class JdbcDemo { 14 15 public static void main(String[] args) { 16 // 1、创建SecurityManager工厂,读取相应的配置文件 17 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 18 // 2、通过SecurityManager工厂获取SecurityManager的实例 19 SecurityManager securityManager = factory.getInstance(); 20 // 3、将securityManager对象设置到运行环境中 21 SecurityUtils.setSecurityManager(securityManager); 22 // 4、通过SecurityUtils获取主体Subject 23 Subject subject = SecurityUtils.getSubject(); 24 // 5、加入登录的用户名zhangsan和1111,这个地方的zhangsan和1111表示用户登录时输入的信息 25 // 而shiro.ini文件中的信息相当于数据库中存放的信息 26 // UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111"); 27 UsernamePasswordToken token = new UsernamePasswordToken("wangwu", "111"); 28 try { 29 // 6、进行用户身份验证 30 subject.login(token); 31 // 7、通过subject来判断用户是否通过验证 32 if (subject.isAuthenticated()) { 33 System.out.println("验证通过"); 34 } 35 } catch (UnknownAccountException e) {// AuthenticationException为父异常 Ctrl+T看子异常 36 System.out.println("用户名/密码不正确"); 37 } catch (IncorrectCredentialsException e) {// AuthenticationException为父异常 Ctrl+T看子异常 38 System.out.println("用户名或密码不正确"); 39 } 40 41 } 42 }
log4j.properties
1 log4j.rootLogger=debug, stdout 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 4 log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
代码运行结果:
5、Authentication Strategy:认证策略,在shiro中有3种认证策略
(1)AtleastOneSuccessfulStrategy:如果一个(或更多)Realm 验证成功, 则整体的尝试被认为是成功的。 如果没有一个验证成功,则整体尝试失败。
(2)FirstSuccessfulStrategy:只要有第一个成功地验证的 Realm返回的信息将被使用 。所有进一步的Realm将被忽略。如果没有一个验证成功, 则整体尝试失败。
(3)AIISucessfulStrategy:为了整体的尝试成功,所有配置的Realm必须验证成功。如果没有一个验证成功,则整体尝试失 败。
默认的策略是:AtleastOneSuccessfulStrategy
6、设置认证策略
1 #验证策略设置 2 authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy 3 securityManager.authenticator.authenticationStrategy=$authenticationStrategy