1.新建maven项目,导入shiro的jar包
<!--导入shiro依赖的commons-loggin的jar包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.0.4</version>
</dependency>
<!--导入shiro的jar包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
2.创建shiro的认证文件
#声明用户的对象
[users]
#=号前面是用户名 后面是密码
zhang=123456
li=654321
3、进行测试
package com.aaa.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class ShiroTest01 {
public static void main(String[] args) {
//创建生成SecurityManager的工厂类对象
Factory<SecurityManager> factory= new IniSecurityManagerFactory("classpath:shiro.ini");
//创建SecurityManager对象
SecurityManager securityManager = factory.getInstance();
//把SecurityManager对象设置给SecurityUtil对象
SecurityUtils.setSecurityManager(securityManager);
//获取验证的主题,当前主题是用户对象
Subject subject = SecurityUtils.getSubject();
//声明要比对的用户名和密码的用户对像,相当于之前前台传过来的要校验的登录信息
UsernamePasswordToken token=new UsernamePasswordToken("张三","123456");
try{
//进行用户校验
subject.login(token);
System.out.println("校验成功");
}catch(UnknownAccountException e){
System.out.println("您输入的用户名不存在");
}catch (IncorrectCredentialsException e){
System.out.println("您输入的密码不存在");
}catch(AuthenticationException e){
System.out.println("校验失败");
}
}
}
还可以自定义realm文件
package com.aaa.realm;
import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm;
public class MyRealm implements Realm {
/**
* 设置本realm的名字
* @return
*/
public String getName() {
return "myRealm";
}
//设置本realm支持什么样的数据校验
public boolean supports(AuthenticationToken authenticationToken) {
return authenticationToken instanceof UsernamePasswordToken;
}
//获取认证信息
public AuthenticationInfo getAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取用户传过来的用户名和密码
String username =(String) authenticationToken.getPrincipal();
char[] credentials = (char[]) authenticationToken.getCredentials();
String password=new String(credentials);
//根据用户名和密码查询数据库看看能不能查询到数据
if (username.equals("张三")&&password.equals("123456")){
return new SimpleAuthenticationInfo(username,password,this.getName());
}else{
//校验失败
throw new AuthenticationException("用户名或者密码错误");
}
}
}
2、在shiro的主配置文件中声明自定义的realm
#声明自定义的realm
myRealm=com.aaa.realm.MyRealm
#设置安全管理器使用我们自定义的realm
securityManager.realms=$myRealm
3.测试
package com.aaa.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class ShiroTest02 {
public static void main(String[] args) {
//获取SecurityManager的工厂类对象
Factory<SecurityManager> factory= new IniSecurityManagerFactory("classpath:shiro-custom.ini");
//获取SecurityManage对象
SecurityManager securityManager = factory.getInstance();
//把securityManager对像存储到securityUtil对象中
SecurityUtils.setSecurityManager(securityManager);
//获取主题对象 也就是当前用户
Subject subject = SecurityUtils.getSubject();
//声明要比较的用户名和密码
UsernamePasswordToken token=new UsernamePasswordToken("张三","123456");
try{
subject.login(token);
System.out.println("登录成功");
}catch (AuthenticationException e){
System.out.println("登录失败");
}
//退出登录
subject.logout();
}
}
三、jdbcRealm
需要导入oracle和dbcp的jar包数据库中要有表
#声明数据源
dataSource=org.apache.commons.dbcp.BasicDataSource
#声明数据源的一些连接属性
dataSource.driverClassName=oracle.jdbc.driver.OracleDriver
dataSource.url=jdbc:oracle:thin:@localhost:1521:orcl
dataSource.username=scott
dataSource.password=tiger
#声明jdbcrealm
jdbcrealm=org.apache.shiro.realm.jdbc.JdbcRealm
#声明jdbcrealm需要用到的数据源属性
jdbcrealm.dataSource=$dataSource
#设置安全管理器使用的jdbcrealm
securityManager.realms=$jdbcrealm
测试
package com.aaa.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class ShiroTest03 {
public static void main(String[] args) {
//获取SecurityManager的工厂类对象
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-jdbcrealm.ini");
//获取SecurityManager对象
SecurityManager securityManager = factory.getInstance();
//把securityManager对象设置到SecurityUtils对象中
SecurityUtils.setSecurityManager(securityManager);
//获取当前主题,即当前对象
Subject subject = SecurityUtils.getSubject();
//传入要验证的用户名和密码
UsernamePasswordToken token=new UsernamePasswordToken("张三","123456");
try{
subject.login(token);
System.out.println("验证成功");
}catch (AuthenticationException e){
System.out.println("校验失败");
}
}
}