spring集成shiro,怎么才能同时生效两个不同的realm?

时间: 2024-02-23 19:57:57 浏览: 20
要同时生效两个不同的realm,你需要在shiro配置文件中配置多个realm,并将它们添加到securityManager中。具体步骤如下: 1. 配置多个realm 在shiro配置文件中,你可以为每个realm配置一个bean,例如: ``` <bean id="realm1" class="com.example.Realm1"> <bean id="realm2" class="com.example.Realm2"> ``` 2. 将多个realm添加到securityManager中 在shiro配置文件中,你需要将多个realm添加到securityManager中,例如: ``` <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realms"> <list> <ref bean="realm1"/> <ref bean="realm2"/> </list> </property> </bean> ``` 这样就可以同时生效两个不同的realm了。当用户登录时,shiro会遍历所有的realm,直到找到一个可以验证用户的realm为止。如果两个realm都可以验证用户,那么会使用第一个配置的realm来进行验证。
相关问题

shiro多个realm

Shiro 支持在一个应用程序中同时使用多个 Realm 来进行身份认证和授权。这种情况通常发生在应用程序中存在多个身份验证和授权的方式,或者需要与多个用户存储系统进行交互的情况下。 要配置多个 Realm,你可以在 Shiro 的配置文件中指定每个 Realm 的详细信息。在配置文件中,你可以使用 `securityManager.realms` 属性来指定多个 Realm 的实现类,并为每个 Realm 配置相应的属性。 以下是一个示例配置文件中配置了两个 Realm 的例子: ```ini [main] # ... securityManager.realms = $myRealm1, $myRealm2 myRealm1 = com.example.realm.MyRealm1 myRealm1.someProperty = someValue1 myRealm2 = com.example.realm.MyRealm2 myRealm2.someProperty = someValue2 ``` 在上面的示例中,`securityManager.realms` 属性指定了两个 Realm:`myRealm1` 和 `myRealm2`。对应的类名分别为 `com.example.realm.MyRealm1` 和 `com.example.realm.MyRealm2`。 每个 Realm 都可以配置自己的属性,例如 `someProperty`。你可以根据自己的需求配置每个 Realm 的属性。 配置完成后,Shiro 将会按照配置文件中定义的顺序依次尝试每个 Realm 进行身份验证和授权操作。 希望这个简单的示例能够帮助你理解 Shiro 多个 Realm 的配置和使用。如有更多疑问,请随时继续提问。

使用Spring加Shiro写一个登录,需要详细代码

以下是使用Spring加Shiro写一个简单的登录功能的详细代码。 1. 配置Shiro 在Spring的配置文件中,配置Shiro的相关内容: ``` <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"/> </bean> <bean id="myRealm" class="com.example.MyRealm"/> <bean class="org.springframework.web.filter.DelegatingFilterProxy"> <property name="targetFilterLifecycle" value="true"/> </bean> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login"/> <property name="successUrl" value="/index"/> <property name="filterChainDefinitions"> <value> /login = anon /logout = logout /** = authc </value> </property> </bean> ``` 在上述配置中,我们配置了Shiro的安全管理器、自定义Realm、Shiro的过滤器等。 2. 编写登录页面 在登录页面中,我们需要使用表单来提交用户名和密码。为了与Shiro进行集成,我们需要在表单中添加名为“rememberMe”的复选框,用于实现记住我功能。 ``` <form method="post" action="/login"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <input type="checkbox" name="rememberMe">记住我 <button type="submit">登录</button> </form> ``` 3. 编写自定义Realm 我们需要继承Shiro的Realm类,并实现其中的认证和授权方法。 ``` public class MyRealm extends AuthorizingRealm { /** * 认证方法 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); String password = new String(upToken.getPassword()); // 根据用户名从数据库中获取用户信息 User user = userService.findByUsername(username); if (user == null) { throw new UnknownAccountException("用户不存在"); } if (!password.equals(user.getPassword())) { throw new IncorrectCredentialsException("密码错误"); } return new SimpleAuthenticationInfo(user, password, getName()); } /** * 授权方法 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { User user = (User) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setRoles(user.getRoles()); info.setStringPermissions(user.getPermissions()); return info; } } ``` 在上述代码中,我们从数据库中获取用户信息,并对用户名和密码进行验证。如果验证通过,则返回一个AuthenticationInfo对象,在后续的认证流程中使用。 在授权方法中,我们从用户信息中获取用户的角色和权限等信息,用于后续的授权流程。 4. 编写登录Controller 在登录Controller中,我们需要处理用户提交的表单数据,并进行Shiro认证流程。 ``` @Controller public class LoginController { @RequestMapping("/login") public String login(HttpServletRequest request) { String exceptionClassName = (String) request.getAttribute("shiroLoginFailure"); if (exceptionClassName != null) { if (UnknownAccountException.class.getName().equals(exceptionClassName)) { request.setAttribute("errorMsg", "用户不存在"); } else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) { request.setAttribute("errorMsg", "密码错误"); } else if (AuthenticationException.class.getName().equals(exceptionClassName)) { request.setAttribute("errorMsg", "认证失败"); } else if (LockedAccountException.class.getName().equals(exceptionClassName)) { request.setAttribute("errorMsg", "账号被锁定"); } else { request.setAttribute("errorMsg", "未知错误"); } } return "login"; } } ``` 在上述代码中,我们判断Shiro认证过程中是否出现异常,并将异常信息存储到request中,用于在登录页面中显示错误信息。 5. 编写登录成功跳转Controller 在登录成功后,我们需要跳转到指定的页面。在Spring MVC中,我们可以使用redirect方式来实现。 ``` @Controller public class IndexController { @RequestMapping("/index") public String index() { return "index"; } } ``` 在上述代码中,我们配置了一个/index的请求映射,用于跳转到index页面。 6. 编写注销Controller 在注销Controller中,我们需要清除Shiro中的缓存信息,并跳转到登录页面。 ``` @Controller public class LogoutController { @RequestMapping("/logout") public String logout() { SecurityUtils.getSubject().logout(); return "redirect:/login"; } } ``` 在上述代码中,我们使用SecurityUtils.getSubject()来获取当前用户的Subject对象,并调用其logout()方法来清除缓存。最后,我们使用redirect方式跳转到登录页面。 以上就是使用Spring加Shiro写一个简单的登录功能的详细代码。

相关推荐

最新推荐

recommend-type

详解Spring Boot 集成Shiro和CAS

主要介绍了详解Spring Boot 集成Shiro和CAS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

spring boot整合redis实现shiro的分布式session共享的方法

本篇文章主要介绍了spring boot整合redis实现shiro的分布式session共享的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

Spring Boot整合Shiro搭建权限管理系统

Spring Boot整合Shiro搭建的一套简单的权限管理系统,里面介绍了Shiro的基本用法,里面附上了代码,环境需要自己搭建(里面有图说明怎么搭建环境的),里面的代码直接复制粘贴就可以运行。感谢大家下载!
recommend-type

spring boot整合Shiro实现单点登录的示例代码

本篇文章主要介绍了spring boot整合Shiro实现单点登录的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

springboot整合shiro登录失败次数限制功能的实现代码

主要介绍了springboot整合shiro-登录失败次数限制功能,实现此功能如果是防止坏人多次尝试,破解密码的情况,所以要限制用户登录尝试次数,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SPDK_NVMF_DISCOVERY_NQN是什么 有什么作用

SPDK_NVMF_DISCOVERY_NQN 是 SPDK (Storage Performance Development Kit) 中用于查询 NVMf (Non-Volatile Memory express over Fabrics) 存储设备名称的协议。NVMf 是一种基于网络的存储协议,可用于连接远程非易失性内存存储器。 SPDK_NVMF_DISCOVERY_NQN 的作用是让存储应用程序能够通过 SPDK 查询 NVMf 存储设备的名称,以便能够访问这些存储设备。通过查询 NVMf 存储设备名称,存储应用程序可以获取必要的信息,例如存储设备的IP地址、端口号、名称等,以便能
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。