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
shiro开发框架,固定信息Realm认证
猜你喜欢
转载自1192890342.iteye.com/blog/2334155
今日推荐
周排行