1. 使用shiro框架来完成认证工作,默认情况下使用的是lniRealm。如果需要使用其他Realm,那么需要进行相关的配置。
2.lni 配置文件讲解:[main]section是你配置应用程序的SecurityManager实例及任何它的依赖组件(如:Realms)的地方。
[main] myRealm=cn.sxt.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可知,要实现JdbcReaml:
a) 需要为jdbcRealm设置dataSource
b) 在指定的dataSource所对应的数据库中应用户表users,该表中有username,password,password_salt等字段。
实现步骤:
a)新建数据库表:
b) 配置 shiro.ini 文件:
[main] #配置数据源 dataSource=com.mchange.v2.c3p0.ComboPooledDataSource dataSource.driverClass=com.mysql.jdbc.Driver dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro dataSource.user=root dataSource.password=1111 jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm #$表示引用对象 jdbcRealm.dataSource=$dataSource securityManager.realm=$jdbcRealm
c) 猜测
public static void main(String[] args) { Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager=factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("wangwu", "1111"); try { subject.login(token); if(subject.isAuthenticated()){ System.out.println("验证通过"); } } catch (AuthenticationException e) { System.out.println("验证失败"); } }
5. Authentication Strategy:认证策略,在shiro中有3种认证策略;
a)AtLeastOneSuccessfulStrategy:如果一个(或更多)Realm 验证成功,则整体的尝试 被认为是成功的。如果没有一个验证成功,则整体尝试失败。
b)FirstSuccessfulStrategy:只要有一个成功地验证的Realm返回的信息将被使用。所有进 一步的Realm 将被忽略。如果没有一个验证成功,则整体尝试失败。
c)AllSucessfulStrategy:为了整体的尝试成功,所有配置的Realm 必须验证成功。如果没 一个验证成功,则整体尝试失败。
默认的策略是:AtLeastOneSuccessfulStrategy
6. 设置认证策略:
#验证策略设置 authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy securityManager.authenticator.authenticationStrategy=$authenticationStrategy