shiro开发框架,固定信息Realm认证

package cn.com.test;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.realm.Realm;
public class MyRealm implements Realm {
	/** 
	 * 判断你当前使用的Token的类型是否为指定的类型
	 */
	public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		String username = (String) token.getPrincipal();  //取得用户名
		//在shiro里面是利用字符数组实现了密码的传递,所以不能将其变为String
		String password = new String((char[]) token.getCredentials()); //取得密码
		//此时直接使用一个固定的用户名和密码进行验证处理操作
		if(!"admin".equals(username)){
			throw new UnknownAccountException("用户名不存在!");
		}
		if(!"hello".equals(password)){
			throw new IncorrectCredentialsException("密码输入错误!") ; 
		}
		return new SimpleAuthenticationInfo(username,password,this.getName());
	}
	// 返回一个当前使用的Realm名字,这个名字可以任意返回,但是不要重名 
	public String getName() {
		return "张三好么?";   //只是一个标记
	}
	/**
	 * 得到用户的认证信息,根据传入的Token取得
	 * token 包含了要进行验证的所有数据 身份验证
	 * 
	 */
	public boolean supports(AuthenticationToken token) {
		// 本次将在之前程序的基础之上继续使用UsernamePasswordToken完成信息的传递
		return token instanceof UsernamePasswordToken;
	}
}


package cn.com.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class TestLoginDemo {
	public static void main(String[] args) { 
		//取得Factory接口对象,主要的目的是用过配置文件加载文件之中的信息,这些信息暂时不能够成为认证信息
		Factory<org.apache.shiro.mgt.SecurityManager> factroy = new 
			IniSecurityManagerFactory("classpath:shiro.ini") ; 
		//取得里面所保存的所有的认证数据信息
		org.apache.shiro.mgt.SecurityManager securityManager = factroy.getInstance() ;
		//利用一个专门的认证操作的处理类,实现认证处理的具体实现
		SecurityUtils.setSecurityManager(securityManager); 
		//获取进行用户名和密码认证的接口对象
		Subject subject = SecurityUtils.getSubject() ; 
		//定义一个Token,里面保存要登录的用户和密码
		UsernamePasswordToken token = new UsernamePasswordToken("mermaid","hello") ;
		//实现用户登录处理 
		subject.login(token); 
		//取得用户名
		System.out.println(subject.getPrincipal());
	}
}

Shiro普通认证
myRealm=cn.com.realm.MyRealm # 整个Shiro中的验证处理都是由SecurityManager接口负责的 securityManager.realms=$myRealm 


基于数据库
需要建立一张数据表:member
   用户ID  varchar(50)pk
   密码    varchar(32)

Shiro.ini文件
[main]
dataSource=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
dataSource.serverName=127.0.0.1
dataSource.databaseName=shirodb
dataSource.user=root
dataSource.password=mysqladmin
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
jdbcRealm.authenticationQuery=SELECT password FROM members WHERE mid=?
securityManager.realms=$jdbcRealm


猜你喜欢

转载自1192890342.iteye.com/blog/2334155