自定义reaml创建使用实现认证

注意清空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创建使用实现认证的更多相关文章
- Shiro第三篇【授权、自定义reaml授权】
Shiro授权 上一篇我们已经讲解了Shiro的认证相关的知识了,现在我们来弄Shiro的授权 Shiro授权的流程和认证的流程其实是差不多的: Shiro支持的授权方式 Shiro支持的授权方式有三 ...
- 利用自定义的AuthenticationFilter实现Basic认证
[ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证 很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前 ...
- 自定义路径创建Cocos2d-x项目
自定义路径创建Cocos2d-x项目 本文介绍windows下面如何优雅的创建Cocos2d-x项目.为何称之为优雅,是因为现在网上流传的一些创建方法有一些问题.大致内容如下: l 使用VS向导创建 ...
- java版微信公众平台自定义菜单创建代码实现
微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...
- 在Azure China用自定义镜像创建Azure VM Scale Set
在Azure China用自定义镜像创建Azure VM Scale Set 在此感谢世纪互联的工程师Johnny Lee和Lan,你们给了我很大的帮助.因为Azure China的官网没有给出完整的 ...
- 使用 Azure CLI 2.0 从自定义磁盘创建 Linux VM
本文说明如何在 Azure 中上传自定义的虚拟硬盘 (VHD) 或复制现有 VHD,并从自定义磁盘创建 Linux 虚拟机 (VM). 可以根据要求安装并配置 Linux 分发版,并使用该 VHD 快 ...
- 一种不通过UI给C4C自定义BO创建测试数据的方式
假设我在Cloud Studio里创建了如下一个非常简单的自定义BO: 我想生成一些该BO的实例.以前我采用的做法是给这个自定义BO创建编辑用的UI.然后使用这些UI创建BO实例.这种方式很花费时间. ...
- 第四讲 自定义Realm来实现身份认证
1.jdbcReam已经实现了从数据库中获取用户的验证信息,但是jdbcRealm灵活性太差.如果要实现自己的一些特殊应用时,将不能支持.这时,可以通过自定义Realm来实现身份的认证功能. 2.Re ...
- asp.net core 3.1 自定义中间件实现jwt token认证
asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...
随机推荐
- 多线程高并发编程(7) -- Future源码分析
一.概念 A Future计算的结果. 提供方法来检查计算是否完成,等待其完成,并检索计算结果. 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪. 取消由cancel方法执行 ...
- 蓝桥杯2019初赛]迷宫(dfs版本)
传送门 大意: 题目的意思还是模板的搜索,不同的是我们要记录路径了,而且是最短字典序最小的路径. 思路: 1.对于字典序最小,也就是说我们要尽量先往下走,然后是左- 这个很简单,因为在dfs中是顺序枚 ...
- P2432 zxbsmk爱查错
描述:https://www.luogu.com.cn/problem/P2432 给你一个主串以及若干个子串,求最少需要删除几个字母,使得主串能由一些子串组成. dp [ i ] 表示前 i 个字符 ...
- CGI (通用网关接口)
CGI cgi即 Common Gateway Interface 译作 通用网关接口 是应用程序与应用程序之间的输入输出协议.比如我们写信,规定了开头一句写称呼,中间写内容,最后署名和日期.看到这种 ...
- php使用curl post josn数据
今天在工作中使用到要使用("Content-Type", "application/json;charset=UTF-8")格式传送和接受数据,再次做个记录 p ...
- Elasticsearch系列---Term Vector工具探查数据
概要 本篇主要介绍一个Term Vector的概念和基本使用方法. term vector是什么? 每次有document数据插入时,elasticsearch除了对document进行正排.倒排索引 ...
- Idea中查看一个类的所有资料及其层级关系
在Idea中直接Ctrl + t 查看类的子类是可以看到,但是他没有那种层级顺序! 我们可以在类中点击顶部菜单Navigate -----> Type Hierarchy
- redis 集群安装
redis集群安装 1.下载redis源码 2.解压并进入解压后的文件夹redis内 3.make,生成一系列的文件(mkreleasehdr.sh, redis-benchmark, redis-c ...
- 自己动手在Linux系统实现一个everything程序
大家好,我是良许. 我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示: Linux 下也有一些类似于 ...
- Excel:公式转数值
跨Workbook引用有些危险,有时要把公式转换为数值.修改频繁,有时也要把公式转换为数值. 方法一,选中区域,复制Ctrl+C,选择性粘贴Ctrl+Alt+V,数值V.方法二,选中区域,复制Ctrl ...