自定义Realm实现认证
自定义Realm实现认证
Shiro默认使用自带的 IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm。
1,Realm接口
最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticatingRealm负责认证,AuthorizingRealm负责授权,
通常自定义的realm继承AuthorizingRealm
shiro.ini
User.java
package com.sxt.domain;import java.util.Date;public class User {private Integer id;private String username;private String pwd;private Date createtime;public User() {}public User(Integer id, String username, String pwd, Date createtime) {super();this.id = id;this.username = username;this.pwd = pwd;this.createtime = createtime;}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;}public Date getCreatetime() {return createtime;}public void setCreatetime(Date createtime) {this.createtime = createtime;}
}
UserService.java
package com.sxt.service;import com.sxt.domain.User;public interface UserService {/*** 根据用户名查询用户对象*/public User queryUserByUserName(String username);}
UserServiceImpl.java
package com.sxt.service.imp;import java.util.Date;import com.sxt.domain.User;
import com.sxt.service.UserService;public class UserServiceImpl implements UserService {@Overridepublic User queryUserByUserName(String username) {User user=null;switch (username) {case "zhangsan":user=new User(1, "zhangsan", "123456", new Date());break;case "lisi":user=new User(2, "lisi", "123456", new Date());break;case "wangwu":user=new User(3, "wangwu", "123456", new Date());break;}return user;}}
UserRealm.java
package com.sxt.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 com.sxt.domain.User;
import com.sxt.service.UserService;
import com.sxt.service.imp.UserServiceImpl;public class UserRealm extends AuthenticatingRealm {private UserService userService=new UserServiceImpl();/*** 做认证*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String username=token.getPrincipal().toString();token.getCredentials();System.out.println(username);/*** 以前登陆的逻辑是 把用户和密码全部发到数据库 去匹配* 在shiro里面是先根据用户名把用户对象查询出来,再来做密码匹配*/User user=userService.queryUserByUserName(username);if(null!=user) {/*** 参数说明* 参数1:可以传到任意对象* 参数2:从数据库里面查询出来的密码* 参数3:当前类名*/SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(user, user.getPwd(), this.getName());return info;}else {//用户不存在 shiro会抛 UnknowAccountExceptionreturn null;}}}
TestAuthenticationApp.java
package com.sxt.shiro;import org.apache.shiro.SecurityUtils;
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;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** shiro的认证使用shiro.ini文件**/
@SuppressWarnings("deprecation")
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,创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager;// 不能使用java.lang.SecurityManagerFactory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");// 2,使用工厂创建安全管理器DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();// 3,创建UserRealm
// UserRealm realm = new UserRealm();// 4,给securityManager注入userRealm
// securityManager.setRealm(realm);// 6,把当前的安全管理器绑定当到线的线程SecurityUtils.setSecurityManager(securityManager);// 7,使用SecurityUtils.getSubject得到主体对象Subject subject = SecurityUtils.getSubject();// 8,封装用户名和密码AuthenticationToken token = new UsernamePasswordToken(username, password);// 9,得到认证try {subject.login(token);System.out.println("认证通过");Object principal = subject.getPrincipal();System.out.println(principal);} catch (IncorrectCredentialsException e) {System.out.println("密码不正确");} catch (UnknownAccountException e) {System.out.println("用户名不存在");}}
}
自定义Realm实现认证相关推荐
- shiro框架,自定义realm注入service失败解决办法
shiro框架,自定义realm注入service失败解决办法 报错如下: org.springframework.beans.factory.BeanCreationException: Error ...
- Shiro框架:Shiro简介、登陆认证入门程序、认证执行流程、使用自定义Realm进行登陆认证、Shiro的MD5散列算法
一.Shiro介绍: 1.什么是shiro: (1)shiro是apache的一个开源框架,是一个权限管理的框架,实现用户认证.用户授权. (2)spring中有spring security,是一个 ...
- shiro认证与授权:自定义realm
[main] #声明realm permReam=cn.learn.shiro.PermissionRealm #注册realm到securityManager中 securityManager.re ...
- Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】
什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...
- shiro自定义Realm
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...
- shiro之自定义realm
前言: 首先我们先分析怎么实现自定义某些realm,按照以往的方法肯定是实现接口或者继承某类 查看继承树结构 通过debug模式下分析源码可以得知 AuthenticatingRealm类中的 doG ...
- Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
一.Shiro授权: 1.授权与权限: (1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源. (2)权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色 ...
- shiro框架多realm登录认证配置
我们做shiro框架经常会遇到这种情况,用户数量很多,又不在同一个表里,比如管理员一个表,用户一个表,商家一个表.这时我们就需要用到多realm来配置让他们用不同得realm来进行登录 首先来说思路, ...
- Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权
Shiro验证策略 Authentication Strategy:认证策略,在shiro中有三种认证策略: AtleastOneSuccessfulStrategy[默认] 如果一个或多个Realm ...
最新文章
- 阮一峰react demo代码研究的学习笔记 - demo5 debug
- “约见”面试官系列之常见面试题第十二篇之cookie和localstorage(建议收藏)
- 两篇波兰地区重金属污染地区土壤微生物多样性的研究
- 排序算法之---堆排序(很重要的一个结构,新手入门必备)
- 亿级Web系统负载均衡几种实现方式
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
- java泛型类型擦除
- 中兴2021批笔试题解
- 安卓一键清理内存_豆豆清理大师免费下载-豆豆清理大师老年版 v1.0.0手机版
- 对央行数字货币系统的理解
- xlwings 冻结窗口格 / 冻结首行/ FreezePanes
- Hive性能调优实战 总结一
- 干法:经营者应该怎样工作
- tornado, twister, cyclone,Typhoon,hurricane…到底如何区别?
- 许三多买了中石油--暴笑股民语录许三多
- Codeforces311D. Interval Cubing 神线段树
- 【其它】颜色的知识--亮度、色相、饱和度、对比度
- 加强版Apktool堪称逆向神器
- 数据库 - 字段属性
- 信号和电源隔离的有效设计技术
热门文章
- ORACLE 字符串函数用法(转载)
- 转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html
- socket层内容详解二
- AngularJS table 按照表头字段排序功能(升序和降序)
- js数组与字符串的相互转换方法
- python-常用函数模块学习-subprocess
- 《基于Node.js实现简易聊天室系列之项目前期工作》
- 判断checkbox是否选中并改变值
- c# as 关键字作用
- Android系统编译so库提示error undefined reference to '__android_log_print问题的解决