shrio配置

本文介绍如何将Shiro安全框架集成到项目中进行认证和授权,并演示了自定义过滤器的具体实现。

    

转载于  http://blog.youkuaiyun.com/shuishouhcd/article/details/9077379


 最近一段时间,我一直在将shiro集成到我的一个项目中,用作认证和授权处理。

            shiro对我来说是个新东西,以下是我学习过的内容:

            http://shiro.apache.org/authorization.html

            http://www.cnblogs.com/skyme/archive/2011/09/11/2173760.html  系列

            http://www.infoq.com/cn/articles/apache-shiro

            http://kdboy.iteye.com/blog/1103794

           如果我那个地方没说明白,可以看这些。

  集成shiro,需要配置web.xml文件,spring的applicationContext.xml配置文件(当然,独立配置一个shiro.xml文件交给spring容器处理也是可以的)。

web.xml文件中的配置:

[html]  view plain copy
  1. <!-- shiro filter的名字是shiroFilter,那么在spring的配置文件中要有一个名字为shiroFilter的bean-->  
  2.    <filter>  
  3.         <filter-name>shiroFilter</filter-name>  
  4.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  5.         <init-param>  
  6.              <param-name>targetFilterLifecycle</param-name>  
  7.              <param-value>true</param-value>  
  8.         </init-param>  
  9.    </filter>  
  10.     
  11.    <filter-mapping>  
  12.         <filter-name>shiroFilter</filter-name>  
  13.         <url-pattern>/*</url-pattern>  
  14.    </filter-mapping>  

applicationContext.xml文件中的配置:

[html]  view plain copy
  1. <!-- 自定义的Shiro Filter-->  
  2.    <bean id="simplePermFilter" class="frame.security.PermissionsAuthorizationFilter"></bean>  
  3. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  4.     <property name="securityManager" ref="securityManager" />  
  5.     <property name="loginUrl" value="/login" />  
  6.     <property name="successUrl" value="/user/list" />  
  7.     <property name="unauthorizedUrl" value="/login" />  
  8.     <property name="filters">    
  9.            <map>    
  10.                <entry key="sperm" value-ref="simplePermFilter"/>  
  11.            </map>    
  12.        </property>    
  13.     <property name="filterChainDefinitions">  
  14.         <value>  
  15.             /Flat-UI-master/**=anon  
  16.             /index.jsp* = anon  
  17.             /test.jsp*=anon  
  18.             /jsp/** = authc  
  19.             /test/objT.do = sperm  
  20.         </value>  
  21.     </property>  
  22. </bean>  
  23. <!--设置自定义realm -->  
  24.    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  25.     <property name="realm" ref="myRealm" />  
  26. </bean>  
  27.    <!-- 配置shiro bean processor-->  
  28.    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  
  29.     <!--myRealm 继承自AuthorizingRealm-->  
  30.     <bean id="myRealm" class="frame.security.MonitorRealm" ></bean>  
  31.     <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  
  32.          <property name="staticMethod"  
  33.               value="org.apache.shiro.SecurityUtils.setSecurityManager" />  
  34.          <property name="arguments" ref="securityManager" />  
  35.     </bean>    
 MonitorRealm.java 是自定义的realm,读取数据库的用户信息,和授权信息。

 PermissionsAuthorizationFilter.java 是自定义的过滤器,来实现自己需要的授权过滤方式。

[java]  view plain copy
  1. public class MonitorRealm extends AuthorizingRealm{  
  2.       
  3.     @Autowired  
  4.     private DAO dao;<span style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 11.818181991577148px; line-height: 17.27272605895996px; background-color: rgb(248, 248, 248);">//这里自己需要什么就注入什么。  </span>  
  5.   
  6.     public MonitorRealm() {  
  7.         super();  
  8.     }  
  9.       
  10.     /** 
  11.      * 授权操作,决定那些角色可以使用那些资源 
  12.      */  
  13.     @Override  
  14.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {  
  15.           
  16.         //<span style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 11.818181991577148px; line-height: 17.27272605895996px; background-color: rgb(248, 248, 248);">TODO </span><span style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 11.818181991577148px; line-height: 17.27272605895996px; background-color: rgb(248, 248, 248);">访问授权信息</span>  
  17.         return info;  
  18.     }  
  19.   
  20.     /** 
  21.      * 认证操作,判断一个请求是否被允许进入系统 
  22.      */  
  23.     @Override  
  24.     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {  
  25.           
  26.         //<span style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 11.818181991577148px; line-height: 17.27272605895996px;">TODO 用户认证信息  </span>  
  27.             return info;    
  28.     }  
  29.   
  30. }  
[java]  view plain copy
  1. public class PermissionsAuthorizationFilter extends AuthorizationFilter {  
  2.   
  3.     public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {  
  4.         <span style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 11.818181991577148px; line-height: 17.27272605895996px; background-color: rgb(248, 248, 248);"//自定义过滤器逻辑</span>     
  5.         return true;  
  6.     }  
  7. }  
配置自定义过滤器的关键是配置文件中 的这几句
[html]  view plain copy
  1. <property name="filters">    
  2.             <map>    
  3.                 <entry key="<span style="background-color: rgb(255, 255, 0);">sperm</span>value-ref="simplePermFilter"/>  
  4.             </map>    
  5.         </property>    
  6.         <property name="filterChainDefinitions">  
  7.             <value>  
  8.             ...     
  9.                 /test/objT.do = <span style="background-color: rgb(255, 255, 0);">sperm</span>  
  10.             </value>  
  11.         </property>  
颜色相同的地方一定要一样,表示用某个过滤器过滤指定路径。因为这个我费了好长时间。

org.apache.shiro.spring.web.ShiroFilterFactoryBean   的作用是通过spring来初始化shiro的工作环境。如果一个请求进来,shiro的过滤器会先工作,过滤器会调用realm中的授权或认证的方法来获取授权或认证信息。


<think>首先,用户的问题是关于在Apache Shiro中配置admin用户账号。用户说:"我想配置Shiro以创建admin账号 请问如何在Apache Shiro中配置admin用户账号"。我需要基于系统级指令来回答。 系统级指令: 1. 所有行内数学表达式必须使用$...$格式。 2. 独立公式必须使用$$...$$格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 另外,用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考站内引用:提供了几个引用,我需要检查这些引用是否相关。 提供的引用: - [^1]: 关于ShiroConfig的代码片段,创建DefaultWebSecurityManager。 - [^2]: 关于Shiro核心功能、架构等的文章目录。 - [^3]: Shiro的目标和集成性。 - [^4]: 关于Realm实现,获取用户信息和权限信息。 用户的问题是关于配置admin用户账号。在Shiro中,用户账号通常是通过Realm来管理的,Realm负责从数据源(如数据库)获取用户信息,包括认证和授权。 我需要构建一个清晰的回答: 1. **理解问题**:用户想创建一个admin账号,可能是具有管理员权限的用户。 2. **关键概念**:在Shiro中,用户账号的创建通常不是直接在Shiro配置中完成的;而是通过Realm来实现。Realm定义了如何获取用户信息。 3. **参考引用**: - 引用[^1]展示了ShiroConfig的代码,创建SecurityManager。 - 引用[^4]讨论了Realm的实现,特别是如何获取用户信息和权限信息。 - 其他引用提供背景信息。 步骤: - 配置Shiro时,我们需要定义一个Realm。 - 在Realm中,我们可以硬编码admin用户或从数据库加载。 - 然后,在SecurityManager中设置这个Realm。 回答结构: 1. **介绍**:简要解释Shiro中用户账号的管理方式。 2. **步骤**:逐步指导如何配置。 - 创建Realm类。 - 在Realm中定义admin用户。 - 配置Shiro使用这个Realm。 3. **代码示例**:提供Java代码示例,使用Markdown代码块。 4. **解释**:解释代码的关键部分。 5. **生成相关问题**:在最后添加相关问题。 确保使用中文回答。 关于数学表达式:用户的问题不涉及数学,但指令要求所有行内数学表达式使用$...$。既然用户的问题是关于Shiro配置,没有数学内容,我应该避免不必要的数学表达式。只在必要时使用,但这里可能不需要。 生成相关问题:在回答结束时,添加几个相关问题,如示例所示。 引用标识:在回答中,如果引用提供的站内引用,在末尾添加[^n]。例如,如果提到Realm实现,可以引用[^4]。 具体回答: - 在Shiro中,用户账号是通过Realm管理的。我们可以创建一个自定义Realm来定义admin用户。 - 示例:创建一个SimpleAccountRealm或自定义Realm。 - 在Realm的初始化中,添加admin用户及其角色和权限。 - 然后,在Shiro配置中设置这个Realm。 代码示例: - 创建一个类继承AuthorizingRealm或SimpleAccountRealm。 - 覆盖方法或添加用户。 - 在ShiroConfig中创建Realm bean并设置到SecurityManager。 参考引用[^4]:它提到了doGetAuthenticationInfo和doGetAuthorizationInfo方法,这正是我们需要实现的。 最终回答: - 开头:解释过程。 - 步骤1:创建自定义Realm。 - 步骤2:实现方法以定义admin用户。 - 步骤3:配置Shiro使用这个Realm。 - 代码示例。 - 注意事项:如安全考虑,建议从数据库加载而不是硬编码。 - 结尾:生成相关问题。</think>### 如何在Apache Shiro中配置admin用户账号 在Apache Shiro中配置admin用户账号,核心是通过自定义`Realm`来实现用户认证和授权管理。Realm是Shiro连接用户数据源(如数据库、内存或配置文件)的桥梁。admin账号的创建通常涉及在Realm中定义该用户的凭证(如用户名和密码)以及分配管理员角色和权限。以下是基于Shiro框架的逐步配置指南,参考了Shiro官方文档和最佳实践[^3][^4]。 #### 步骤1: 创建自定义Realm类 首先,定义一个自定义Realm类,继承`AuthorizingRealm`。在该类中,您需要实现两个核心方法: - `doGetAuthenticationInfo()`:处理用户认证(登录),验证用户名和密码。 - `doGetAuthorizationInfo()`:处理用户授权,分配角色和权限。 这里,我们硬编码一个admin用户(用户名`admin`,密码`admin123`),并为其分配管理员角色(`adminRole`)和权限(如`user:manage`)。实际生产环境中,建议从数据库加载用户数据[^4]。 ```java import org.apache.shiro.authc.*; import org.apache.shiro.authz.*; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import java.util.*; public class AdminRealm extends AuthorizingRealm { // 认证方法:验证用户身份 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); char[] password = upToken.getPassword(); // 硬编码admin用户(实际应从数据库查询) if ("admin".equals(username)) { // 参数:用户名、密码(需加密)、Realm名称 return new SimpleAuthenticationInfo(username, "admin123".toCharArray(), getName()); } else { throw new UnknownAccountException("用户不存在"); } } // 授权方法:分配角色和权限 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 为admin用户添加角色和权限 if ("admin".equals(username)) { Set<String> roles = new HashSet<>(); roles.add("adminRole"); // 添加管理员角色 authorizationInfo.setRoles(roles); Set<String> permissions = new HashSet<>(); permissions.add("user:manage"); // 添加管理权限,如用户管理 permissions.add("system:config"); // 系统配置权限 authorizationInfo.setStringPermissions(permissions); } return authorizationInfo; } } ``` #### 步骤2: 配置Shiro SecurityManager 在Shiro配置类中,创建`SecurityManager`并注入自定义Realm。这里使用Spring Boot风格的配置(基于`@Configuration`),参考了引用[^1]中的示例。确保将自定义Realm设置为SecurityManager的依赖。 ```java import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { // 创建自定义Realm Bean @Bean public AdminRealm adminRealm() { return new AdminRealm(); } // 配置SecurityManager,注入Realm @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(adminRealm()); // 设置自定义Realm // 可选:添加缓存或会话管理器配置 return securityManager; } // 配置URL权限规则(例如,保护admin路径) @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); chainDefinition.addPathDefinition("/admin/**", "authc, roles[adminRole]"); // 需adminRole角色访问 chainDefinition.addPathDefinition("/**", "anon"); // 其他路径匿名访问 return chainDefinition; } } ``` #### 关键解释 - **认证过程**:当用户登录时,Shiro调用`doGetAuthenticationInfo`验证用户名和密码。示例中,admin用户使用密码`admin123`登录[^2][^4]。 - **授权过程**:登录成功后,Shiro通过`doGetAuthorizationInfo`为admin用户分配角色`adminRole`和权限(如`user:manage`),确保其能访问受限资源[^2][^4]。 - **安全建议**: - **避免硬编码密码**:生产环境中,应从数据库或加密存储加载用户信息。可以使用Shiro的`HashedCredentialsMatcher`加密密码,例如使用SHA-256算法[^4]。 - **扩展性**:如需动态管理用户,可集成数据库(如MySQL),并在Realm中查询用户表[^3][^4]。 - **测试admin账号**:启动应用后,访问登录接口(如`/login`),使用用户名`admin`和密码`admin123`即可获得管理员权限。 此配置实现了Shiro的核心目标:灵活集成到各种环境,从简单应用到企业级系统[^3]。如果您的权限模型更复杂,可参考Shiro文档调整角色和权限定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值