注意清空shiro.ini

创建User对象

package cn.zys.Bean;

public class User {
private Integer id;
private String username;
private String pwd;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", pwd=" + pwd + "]";
}
public User(Integer id, String username, String pwd) {
super();
this.id = id;
this.username = username;
this.pwd = pwd;
} }

创建模拟请求数据Servise

package cn.zys.servise;
import cn.zys.Bean.User; public class Servise { public User queryUser(String username){
User user = null;
switch (username) {
case "zhangsan":
user = new User(1,"zhangsan","123456");
break;
case "lisi":
user = new User(2,"lisi","123456");
break;
case "wangwu":
user = new User(3,"wangwu","123456");
break;
default:
break;
}
System.out.println(user.toString());
return user;
} }

创建UserRealm  继承 AuthenticatingRealm

package cn.zys.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.realm.AuthenticatingRealm; import cn.zys.Bean.User;
import cn.zys.servise.Servise; public class UserRealm extends AuthenticatingRealm{ private Servise servise = new Servise(); //做认证的方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// TODO Auto-generated method stub
//再shiro中根据用户名查出相关信息,再判断,为以后做加密做准备被
String username = (String) token.getPrincipal();
System.out.println(username); token.getPrincipal();
User user = servise.queryUser(username);
if(user != null){
/*
* 参数说明
* 参数1 可以传入任意对象
* 2 从数据库中查出的密码
* 3 当前类名
* */
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, user.getPwd(), this.getName());
return info; }
return null;
} }

TestAuthenticationApp测试认证

package cn.zys.shiro;

import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import cn.zys.realm.UserRealm; import java.util.Arrays;
import java.util.Iterator;
import java.util.List; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
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.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject; public class TestAuthenticationApp {
//日志输出工具
private static final transient Logger log = LoggerFactory.getLogger(TestAuthenticationApp.class);
public static void main(String[] args) { String username = "zhangsan";
String password = "123456"; log.info("My First Apache Shiro Application");
//1 创建安全管理器的工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2 使用工厂创建安全管理器
DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();
//3 把当前的安全管理器绑定到线程
//创建userRealm
UserRealm realm = new UserRealm();
//securityManager 中注入userrealm
securityManager.setRealm(realm);
SecurityUtils.setSecurityManager(securityManager);
//4 使用SecurityUtils.getSubject() 得到主体
Subject currentUser = SecurityUtils.getSubject();
//5 封装用户名
AuthenticationToken arg0 = new UsernamePasswordToken(username, password);
// System.out.println(arg0);
try {
currentUser.login(arg0);
System.out.println("认证通过");
Object getPrincipal = currentUser.getPrincipal();
System.out.println(getPrincipal);
} /*catch (AuthenticationException e) {
// TODO: handle exception
System.out.println("用户名或密码错误");
}*/catch(IncorrectCredentialsException e){
System.out.println("密码不正确");
}catch(UnknownAccountException e){
System.out.println("用户名不存在");
} //退出的方法
//currentUser.logout(); }
}

自定义reaml创建使用实现认证的更多相关文章

  1. Shiro第三篇【授权、自定义reaml授权】

    Shiro授权 上一篇我们已经讲解了Shiro的认证相关的知识了,现在我们来弄Shiro的授权 Shiro授权的流程和认证的流程其实是差不多的: Shiro支持的授权方式 Shiro支持的授权方式有三 ...

  2. 利用自定义的AuthenticationFilter实现Basic认证

    [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证   很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前 ...

  3. 自定义路径创建Cocos2d-x项目

    自定义路径创建Cocos2d-x项目 本文介绍windows下面如何优雅的创建Cocos2d-x项目.为何称之为优雅,是因为现在网上流传的一些创建方法有一些问题.大致内容如下: l  使用VS向导创建 ...

  4. java版微信公众平台自定义菜单创建代码实现

    微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...

  5. 在Azure China用自定义镜像创建Azure VM Scale Set

    在Azure China用自定义镜像创建Azure VM Scale Set 在此感谢世纪互联的工程师Johnny Lee和Lan,你们给了我很大的帮助.因为Azure China的官网没有给出完整的 ...

  6. 使用 Azure CLI 2.0 从自定义磁盘创建 Linux VM

    本文说明如何在 Azure 中上传自定义的虚拟硬盘 (VHD) 或复制现有 VHD,并从自定义磁盘创建 Linux 虚拟机 (VM). 可以根据要求安装并配置 Linux 分发版,并使用该 VHD 快 ...

  7. 一种不通过UI给C4C自定义BO创建测试数据的方式

    假设我在Cloud Studio里创建了如下一个非常简单的自定义BO: 我想生成一些该BO的实例.以前我采用的做法是给这个自定义BO创建编辑用的UI.然后使用这些UI创建BO实例.这种方式很花费时间. ...

  8. 第四讲 自定义Realm来实现身份认证

    1.jdbcReam已经实现了从数据库中获取用户的验证信息,但是jdbcRealm灵活性太差.如果要实现自己的一些特殊应用时,将不能支持.这时,可以通过自定义Realm来实现身份的认证功能. 2.Re ...

  9. asp.net core 3.1 自定义中间件实现jwt token认证

    asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...

随机推荐

  1. flex学习

            今天看视频学习的时候,发现css有一个 flex 的属性,非常的好用,为了让自己能够熟记,特意来分享一下flex的用法. 首先,采用Flex布局的元素,称为Flex容器(flex co ...

  2. iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)...

    本文Demo传送门: MessageForwardingDemo 摘要:编程,只了解原理不行,必须实战才能知道应用场景.本系列尝试阐述runtime相关理论的同时介绍一些实战场景,而本文则是本系列的消 ...

  3. EntityFramework 迁移遇到的问题

    2019独角兽企业重金招聘Python工程师标准>>> 添加迁移add-migration migrationname 更新数据Update-Database EntityFrame ...

  4. 算法竞赛进阶指南--在单调递增序列a中查找小于等于x的数中最大的一个(即x或x的前驱)

    在单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱) while (l < r) { int mid = (l + r + 1) / 2; if (a[mid] <= x) ...

  5. Codeforce-Ozon Tech Challenge 2020-A. Kuroni and the Gifts

    the i-th necklace has a brightness ai, where all the ai are pairwise distinct (i.e. all ai are diffe ...

  6. bzoj 4152[AMPPZ2014]The Captain

    bzoj 4152[AMPPZ2014]The Captain 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. ...

  7. flask完成前后端分离实例

    需求:通过页面点击完成简单的投票系统功能. 相关文件: 设计思路: 1.前端:提供可以投票的入口.查询的入口.(前端不做数据处理,只做展示) 使用<a>  </a> 完成超链接 ...

  8. Oracle触发器之替代触发器

    替代触发器 替代视图增删改操作.视图可以认为成逻辑上的一张表,类似于把一个sql语句的执行结果永久的像表存储到数据 库中,视图一般用来做查询. 创建视图的语法: create view 视图名称 as ...

  9. 王颖奇 20171010129《面向对象程序设计(java)》第十五周学习总结

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 学习总结: 理论部分: ◼ JAR文件◼ 应用程序首选项存储◼ Java Web Start JAR文件: 1.Java程序的打 ...

  10. Android下拉刷新SwipeRefreshLayout简单用法

    之前一直都想用下拉刷新,感觉上是庞大的工程,所以搁置了.现在学习了一下其实真的超级简单. 看了<第一行代码>以及 https://www.jianshu.com/p/3c402a9e4b7 ...