? Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。
? 身份认证、授权、加密、会话管理
? authentication 身份认证
? authorization 授权
? strategy 策略
? 分为五步:
Subject
用户主体:请求的发起者,即访问应用的用户
SecurityManager
安全管理器:Shiro的核心,用来分发请求
Authenticator
认证器:用来进行认证操作
Authentication Strategy
认证策略,针对多个Realm
Realm
安全数据源:用来进行数据匹配的,可以通过多种数据源进行匹配认证,如文件、数据库、QQ、微信、手机号等
? 登陆和退出
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro-core.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
? Shiro使用的是INI格式的配置文件,键值对的配置,可以分类进行配置
#配置用户信息
[users]
admin=123
tom=456
public static void main(String[] args) {
//1.获取SecurityManager,指定配置文件初始化
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro01/shiro.ini");
SecurityManager securityManager = factory.getInstance();
//2.对securityManager进行封装,绑定给SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
//3.获取用户主体Subject
Subject subject = SecurityUtils.getSubject();
//4.登陆
System.out.println("是否认证:"+subject.isAuthenticated());
UsernamePasswordToken token = new UsernamePasswordToken("admin", "456");
try {
subject.login(token);
} catch(UnknownAccountException e){
System.out.println("未知的账户!e:"+e.getMessage());
} catch (IncorrectCredentialsException e){
System.out.println("错误的密码!e:"+e.getMessage());
} catch (AuthenticationException e) {
System.out.println("认证异常!e:"+e.getMessage());
}
System.out.println("是否认证:"+subject.isAuthenticated());
//5.退出
subject.logout();
System.out.println("是否认证:"+subject.isAuthenticated());
}
#默认的SecurityManager
securityManager=org.apache.shiro.mgt.DefaultSecurityManager
#默认的认证器
authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
securityManager.authenticator=$authenticator
#默认的认证策略
authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
authenticator.authenticationStrategy=$authenticationStrategy
#默认的Realm
iniRealm=org.apache.shiro.realm.text.IniRealm
securityManager.realms=$iniRealm
? 默认有三种Realm:IniReaml、JdbcRealm、PropertiesRealm
#配置数据源
dataSource=com.alibaba.druid.pool.DruidDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/shiro?useUnicode=true&characterEncoding=utf8
dataSource.username=root
#使用JdbcRealm
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
#重写认证的查询语句
jdbcRealm.authenticationQuery=select password from t_user where login_name=?
securityManager.realms=$jdbcRealm
? 步骤:
? 针对多个Realm,可以对认证Realm的个数进行配置
? 三种认证策略:
AtLeastOneSuccessfulStrategy 默认
只要有一个Realm验证成功即可,返回所有Realm身份验证成功的认证信息
FirstSuccessfulStrategy
只要有一个Realm验证成功即可,返回第一个Realm身份认证成功的认证信息
AllSuccessfulStrategy
所有Realm都验证成功才算成功
? 注:三种认证策略都会对所有Realm进行匹配
#认证策略
#authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
#authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy
authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy
#认证器
authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
authenticator.authenticationStrategy=$authenticationStrategy
securityManager.authenticator=$authenticator
securityManager.realms=$propertiesRealm,$jdbcRealm
原文:http://blog.51cto.com/12402007/2155009