所需要的jar包
百度云连接:http://pan.baidu.com/s/1eRLwkcq
入门案例
first.ini 配置文件
[users]
zhangsan=123
lisi=123
class类
//shiro实现用户认证
@Test
public void test1()
{
//1:基于ini配置文件创建SecurityManager的工厂
// 配置文件中的信息相当于数据库中的文件信息
// 将数据库中的信息拿来对比
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:first.ini");
//2:使用工厂得到SecurityManager实例
SecurityManager securityManager = factory.getInstance();
//3:使用SecurityUtils把SecurityManager对象设置到当前环境中
// 将刚刚得到的对象加载当前程序中 进行使用
SecurityUtils.setSecurityManager(securityManager);
//4:得到进行认证的主体:Subject
// 以上应该是先设置路径 等到的得到了数据后进行对比
Subject subject = SecurityUtils.getSubject();
//5:把进行认证的用户名和密码封装成token对象
// 获得将要对比的对象
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan2", "123");
//6:提交认证
// 进行对比
subject.login(token);
//7:判断认证是否通过
// 判断是否对比通过 通过则返回true 失败则返回false
boolean boo = subject.isAuthenticated();
System.out.println(boo);
//用户退出
// 用户推出相当于将session清空 后对比将对比失败
subject.logout();//清空session
boo = subject.isAuthenticated();
System.out.println(boo);
/**
* SecurityManager调用认证器Authenticator进行认证,实际上是Authenticator的子类
* ModularRealmAuthenticator进行认证,Modular把用户认证的token传给Realm,默认IniRealm
* 根据token中的用户名去ini配置文件中查找用户名,如果没找到返回null,如果找到了把用户信息返回给ModularRealmAuthenticator,
* ModularRealmAuthenticator再根据realm返回的信息验证用户输入的密码是否正确
*
* 密码不正确的异常:org.apache.shiro.authc.IncorrectCredentialsException:
* 用户名不正确:org.apache.shiro.authc.UnknownAccountException:
*/
}
使用自定义reaml
shiro-realm.ini 配置文件
[main]
myRealm=com.qianfeng.realm.MyRealm
securityManager.realms=$myRealm
class文件
@Test
public void test2()
{
//使用自定义的realm实现认证
// 调用自定义的reaml
Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro-realm.ini");
//从factory工厂中获得secrityManager
SecurityManager securityManager = factory.getInstance();
//将securityManager加载到当前环境中
SecurityUtils.setSecurityManager(securityManager);
//得到进行认证的路径
Subject subject = SecurityUtils.getSubject();
//获得需要验证的路径
UsernamePasswordToken token =new UsernamePasswordToken("zhangsan", "123");
//将数据进行对比
subject.login(token);
//得到对比的结果
boolean boo = subject.isAuthenticated();
System.out.println(boo);
}
自定义reaml
package com.qianfeng.realm;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
//自定义的realm
public class MyRealm extends AuthorizingRealm{
//继承父类的接口
@Override
public void setName(String name) {
super.setName("myRealm");
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
//参数token接收的是认证器传过来的UsernamePasswordToken对象
String usercode = (String) token.getPrincipal();//得到认证的用户输入的用户名
//根据用户名去数据库中查找该用户名是否存在
//....
//模拟没有查找到:返回null
if(!usercode.equals("xiaohua"))
return null;
//查询出来该用户名
String password="123";
//把用户的信息返回给认证器
SimpleAuthenticationInfo info =new SimpleAuthenticationInfo(usercode, password, this.getName());
return info;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}
}