自定义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实现认证相关推荐

  1. shiro框架,自定义realm注入service失败解决办法

    shiro框架,自定义realm注入service失败解决办法 报错如下: org.springframework.beans.factory.BeanCreationException: Error ...

  2. Shiro框架:Shiro简介、登陆认证入门程序、认证执行流程、使用自定义Realm进行登陆认证、Shiro的MD5散列算法

    一.Shiro介绍: 1.什么是shiro: (1)shiro是apache的一个开源框架,是一个权限管理的框架,实现用户认证.用户授权. (2)spring中有spring security,是一个 ...

  3. shiro认证与授权:自定义realm

    [main] #声明realm permReam=cn.learn.shiro.PermissionRealm #注册realm到securityManager中 securityManager.re ...

  4. Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】

    什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...

  5. shiro自定义Realm

    1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...

  6. shiro之自定义realm

    前言: 首先我们先分析怎么实现自定义某些realm,按照以往的方法肯定是实现接口或者继承某类 查看继承树结构 通过debug模式下分析源码可以得知 AuthenticatingRealm类中的 doG ...

  7. Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权

    一.Shiro授权: 1.授权与权限: (1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源. (2)权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色 ...

  8. shiro框架多realm登录认证配置

    我们做shiro框架经常会遇到这种情况,用户数量很多,又不在同一个表里,比如管理员一个表,用户一个表,商家一个表.这时我们就需要用到多realm来配置让他们用不同得realm来进行登录 首先来说思路, ...

  9. Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权

    Shiro验证策略 Authentication Strategy:认证策略,在shiro中有三种认证策略: AtleastOneSuccessfulStrategy[默认] 如果一个或多个Realm ...

最新文章

  1. 阮一峰react demo代码研究的学习笔记 - demo5 debug
  2. “约见”面试官系列之常见面试题第十二篇之cookie和localstorage(建议收藏)
  3. 两篇波兰地区重金属污染地区土壤微生物多样性的研究
  4. 排序算法之---堆排序(很重要的一个结构,新手入门必备)
  5. 亿级Web系统负载均衡几种实现方式
  6. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
  7. java泛型类型擦除
  8. 中兴2021批笔试题解
  9. 安卓一键清理内存_豆豆清理大师免费下载-豆豆清理大师老年版 v1.0.0手机版
  10. 对央行数字货币系统的理解
  11. xlwings 冻结窗口格 / 冻结首行/ FreezePanes
  12. Hive性能调优实战 总结一
  13. 干法:经营者应该怎样工作
  14. tornado, twister, cyclone,Typhoon,hurricane…到底如何区别?
  15. 许三多买了中石油--暴笑股民语录许三多
  16. Codeforces311D. Interval Cubing 神线段树
  17. 【其它】颜色的知识--亮度、色相、饱和度、对比度
  18. 加强版Apktool堪称逆向神器
  19. 数据库 - 字段属性
  20. 信号和电源隔离的有效设计技术

热门文章

  1. ORACLE 字符串函数用法(转载)
  2. 转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html
  3. socket层内容详解二
  4. AngularJS table 按照表头字段排序功能(升序和降序)
  5. js数组与字符串的相互转换方法
  6. python-常用函数模块学习-subprocess
  7. 《基于Node.js实现简易聊天室系列之项目前期工作》
  8. 判断checkbox是否选中并改变值
  9. c# as 关键字作用
  10. Android系统编译so库提示error undefined reference to '__android_log_print问题的解决