shiro多Realm第一次调用不生效问题】的更多相关文章

1. 由于最近自己写的一个项目上用到了多realm的使用,遇到了一个这样的问题: 1. 自己继承了BasicHttpAuthenticationFilter,实现了获取token,然后直接请求api的方法,但是每次第一次调用的时候都是无效的,第二次请求又是正常的. 以下为配置文件 @Bean public ShiroFilterFactoryBean shirFilter(org.apache.shiro.mgt.SecurityManager securityManager) { logger…
认证流程: 1.获取当前Subject.调用SecurityUtils.getSubject(); 2.测试当前用户是否已经被认证,即是否已经登录,调用Subject的isAurhenticated(); 3.若没有认证,则把用户名和密码封装成UsernamePasswordToken对象. 对于B/S应用程序来说,一般用户名和密码是在前台表单中获得的: 1.创建一个表单页面. 2.把请求提交到SpringMVC的Controller. 3.获取用户名和密码. 4.执行登录:调用Subject.…
6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系   即用户-角色之间是多对多关系,角色-权限之间是多对多关系:且用户和权限之间通过角色建立关系:在系统中验证时通过权限验证,角色只是权限集合,即所谓的显示角色:其实权限应该对应到资源(如菜单.URL.页面按钮.Java方法等)中,即应该将权限字符串存储到资源实体中,但是目前为了简单化,直接提取一个权限表,[综合示例…
用Shiro做登录权限控制时,密码加密是自定义的. 数据库的密码通过散列获取,如下,算法为:md5,盐为一个随机数字,散列迭代次数为3次,最终将salt与散列后的密码保存到数据库内,第二次登录时将登录的令牌再进行同样的运算后再与数据库的做对比. String algorithmName = "md5";String userName = "rose";String password = "rose123";int hashIterations =…
写了一个WCF Serivces供外部程序通过.NET Businesss Connector调用AX的代码,第一次调用的时候总是很慢,有时候甚至超过1分钟,访问地址改成http://localhost的时候第一次调用又很快,改成IP地址后第一次就非常慢. 之所以这样是因为通过添加服务引用的方式生成的配置文件里,默认把useDefaultWebProxy设置为true了,这种情况下在连接WCF Serives的时候客户端总是尝试查找代理,找不到后再直接连,这个时间很长,所以会出现超时,解决办法是…
.net2.0的winform客户端最常用的与服务端通信方式是通过webservice,最近在用dottrace对客户端做性能测试的时候发现,客户端程序启动以后,第一次调用某一个webservice的方法是,总是特别慢,大概需要0.8-1秒钟的时间,而接下来掉其他方法就很快了,都只需要几十毫秒.google了一把,找到解决办法: 在应用程序的config文件中加入以下配置节: <system.net> <defaultProxy enabled="false" use…
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm.分享牛系列,分享牛专栏,分享牛. 1.1.1 shiro提供的realm 最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权,通常自定义的realm继承AuthorizingRealm. 1.1.2…
在第一次访问服务消费者的时候(消费者去调用服务提供者服务)会出现如下异常: com.netflix.hystrix.exception.HystrixRuntimeException: TestService#hello(String) timed-out and no fallback available 解决方案是在application.properties增加如下配置信息: #hystrix调用方法的超时时间,默认是1000毫秒 hystrix.command.default.execu…
在使用js 调用表单组件模板的时候,表单内有一个编辑框 第一次调出的时候,百度编辑器正常显示,关闭后,再打开,百度编辑器不能显示 原因:第一次使用的时候, UE.getEditor('node_content'); 已经创建了一个对象,第二次再使用的时候,调用此方法发现对象已经存在,不再创建对象,所以第二次不能显示 解决办法: 设置一个全局对象 var editor; 第一次调用的时候 editor = UE.getEditor('node_content'); 关闭时销毁这个对象 editor…
使用缓存,可以解决每次访问请求都查数据库的问题.第一次授权后存入缓存. 缓存流程 shiro中提供了对认证信息和授权信息的缓存.shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的.主要研究授权信息缓存,因为授权的数据量大. 用户认证通过. 该 用户第一次授权:调用realm查询数据库 该 用户第二次授权:不调用realm查询数据库,直接从缓存中取出授权信息(权限标识符). -------------------------------------使用ehcache缓存框架…
Realm是shiro比较核心的接口,简单说它的实现类就是校验用户输入的账号信息的地方.如果想自定义实现一般的配置文件如下: <!--自定义Realm 继承自AuthorizingRealm --> <bean id="userRealm" class="xxx.UserRealm"> <!-- 自定义比对器 --> <property name="credentialsMatcher" ref=&quo…
假设现在有这样一种需求:存在两张表user和admin,分别记录普通用户和管理员的信息.并且现在要实现普通用户和管理员的分开登录,即需要两个Realm——UserRealm和AdminRealm,分别处理普通用户和管理员的验证功能.  但是正常情况下,当定义了两个Realm,无论是普通用户登录,还是管理员登录,都会由这两个Realm共同处理.这是因为,当配置了多个Realm时,我们通常使用的认证器是shiro自带的org.apache.shiro.authc.pam.ModularRealmAu…
上面一章说到shiro的认证和授权最底层就是调用realm的getAuthorizationInfo(获取用户的角色和资源)和getAuthenticationInfo(校验账号密码是否正确)两个方法. 如果我们要从数据库中查询用户和他的权限信息,我们可以使用shiro提供给我们的JdbcRealm JdbcRealm 添加jar <dependency> <groupId>mysql</groupId> <artifactId>mysql-connecto…
之前在Authentication和Authorization中也提到Realm. 无论是身份验证还是权限验证,无论数据以什么方式存在,我们都需要访问一些数据并将其转换为Shiro可以识别的格式. 通常一个数据源对应一个Realm.因此,实现一个Realm时会用到该数据源相关的API. 通常一个数据源中会同时保存身份相关数据与权限相关数据.因此,一个Realm实现类可以进行认证和授权两种操作. 可以将Realm简单地理解为DAO. (虽然IDEA生成的type hirarchy diagram很…
public class UserRealm extends AuthorizingRealm { private UserService userService = new UserServiceImpl(); protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal()…
一:先从登录开始,直接看代码 @RequestMapping(value="dologin",method = {RequestMethod.GET, RequestMethod.POST},produces="text/html;charset=UTF-8") @ResponseBody public ResultJson systemUserdologin(XXX xxx,HttpServletRequest request,HttpServletRespons…
转自: http://blog.csdn.net/xiangwanpeng/article/details/54802509 (使用特定的realm实现特定的验证) 假设现在有这样一种需求:存在两张表user和admin,分别记录普通用户和管理员的信息.并且现在要实现普通用户和管理员的分开登录,即需要两个Realm——UserRealm和AdminRealm,分别处理普通用户和管理员的验证功能.  但是正常情况下,当定义了两个Realm,无论是普通用户登录,还是管理员登录,都会由这两个Realm…
在单Realm的基础上,进行如下内容的修改 原有的ShiroRealm.java: package com.atguigu.shiro.realms; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.…
首先,我们要明确认证的流程: 1. 获取当前的 Subject. 调用 SecurityUtils.getSubject(); 2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated() 3. 若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象 1). 创建一个表单页面 2). 把请求提交到 SpringMVC 的 Handler 3). 获取用户名和密码. 4. 执行登录: 调用 Subject 的…
上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: [main] # your custom realm path fooRealm=com.lee.shiro.realm.FooRealm # DI such as spring DI securityManager.realms=$fooRealm 自定义realm认证: /** * 设置real…
最近做项目,发现linq调用存储过程,第一次时会速度慢,但之后速度都很快,过一阵子又会慢一下,以实际的操作为例子: using (FruitDbDataContext dbo = new FruitDbDataContext(GlobalInfo.Instance.ConnectString)) {     dbo.CommandTimeout = GlobalInfo.Instance.DbTimeOutSeconds;     执行存储过程 } 第一次执行大约2秒 改成 using (Sql…
功能描述: 当用户退出(主动)或者关闭浏览器(session超时)的时候,利用本次登录Ip更新上次登录IP.有人可能要问,你在用户登录的时候记录不就行了.可是我有两个字段,一个为本次登录IP,另外一个为上次登录IP.当用户退出的时候,本次登录IP也就成了上次登录IP. 首先解决的问题是:在Listener里面访问Service. 因为是基于注解开发,将Listener扫描和将Service成员变量注解@Autowired是不能解决问题的.运行起来会报空指针. public class UserL…
1.1     散列算法 通常需要对密码 进行散列,常用的有md5.sha, 对md5密码,如果知道散列后的值可以通过穷举算法,得到md5密码对应的明文. 建议对md5进行散列时加salt(盐),进行加密相当 于对原始密码+盐进行散列.(盐就相当于加入一个随机数) 正常使用时散列方法: 在程序中对原始密码+盐进行散列,将散列值存储到数据库中,并且还要将盐也要存储在数据库中. 如果进行密码对比时,使用相同 方法,将原始密码+盐进行散列,进行比对. 1.2 MD5测试 package cn.qlq.…
上一节介绍了realm的作用: realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null.token就相当于是对用户输入的用户名和密码的一个封装.下面就是创建一个用户名密码token: UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111"); Realm结构:…
Web 项目使用shiro,针对这个问题可以重写DefaultWebSessionManager,将缓存数据存放到request中,这样可以保证每次请求(可能会多次调用doReadSession方法)只请求一次redis.具体扩展如下: 添加MyWebSessionManager.java package com.xiyinli.web.shiro; import org.apache.shiro.session.ExpiredSessionException; import org.apach…
shiro进行登录认证和权限管理的实现.其中需求涉及使用两个角色分别是:门店,公司.现在要两者实现分开登录.即需要两个Realm——MyShiroRealmSHOP和MyShiroRealmCOMPANY,分别处理门店,公司的验证功能. 但是正常情况下,当定义了多个Realm,无论是门店登录还是公司登录,都会由这两个Realm共同处理.这是因为,当配置了多个Realm时,我们通常使用的认证器是shiro自带的org.apache.shiro.authc.pam.ModularRealmAuthe…
public class UserRealm extends AuthorizingRealm { private UserService userService = new UserServiceImpl(); protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal()…
@Cacheable 注解在对象内部调用不会生效 代码示例:ProductServiceImpl.java public List<ProductInfoVO> getProductList(CommonRequest<ProductInfoDTO> reqest) { // @Cacheable失效,不会走缓存的 return this.findProductInfoList(reqest); } @Cacheable(cacheNames = "productInfo…
问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方法被同一个类调用的时候,spring无法将这个方法加到事务管理中. 我们来看一下生效时候和不生效时候调用堆栈日志的对比.     通过对比两个调用堆栈可以看出,spring的@Transactional事务生效的一个前提是进行方法调用前经过拦截器TransactionInterceptor,也就是说…
@Transactional 内部调用例子 在 Spring 的 AOP 代理下,只有目标方法由外部调用,目标方法才由 Spring 生成的代理对象来管理,这会造成自调用问题.若同一类中的其他没有@Transactional 注解的方法内部调用有@Transactional 注解的方法,有@Transactional 注解的方法的事务被忽略,不会发生回滚 @Service public class A{ public void action(){ dosome(); } @Transaction…