通过ShiroFilter和定义在shiro.ini中的配置信息,即可在项目接收用户访问时,进行身份,角色,权限进行访问控制啦!!!!
现在的项目架构六、Spring集成
web项目的核心组件都在spring工厂中管理,利用IOC和AOP,组建了关系松散,稳健的系统。
shiro的诸多组件也需要由spring统一管理,进而可以更好的和其他组件协作。
之前的Realm中一直有如下代码:
//由于Realm还未进入spring工厂,所以无法直接注入工厂内部的DAO组件 UserService userService =(UserService)ContextLoader.getCurrentWebApplicationContext().getBean("xx");ops:shiro的组件都是pojo组件,非常容易用spring管理,可以方便的从ini迁移到spring
6.1 pom <!-- 其他依赖和web集成中 一致 ,此处省略--> <!-- 新增一个依赖 用于在工厂中生产 ShiroFilter--> <!-- 会传递导入shiro-core 和 shiro-web --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> 6.2 aplicationContext.xml将SecurityManager和Realm和ShiroFilter 都迁移到applicationContext.xml中
建议将如下配置,单独定义在一个配置文件:shiro-spring.xml,然后在applicationContext.xml中引入:
<import resource="classpath:shiro-spring.xml"/>
<!-- 连接池,SqlSessionFactory,MapperScannerConfigurer,事务控制等 配置不变 --> <!-- 添加如下shiro配置 --> <!-- shiro --> <!-- 声明realm --> <bean> <property ref="userService"/> </bean> <!-- 声明SecurityManager --> <bean> <!-- 注入Realm --> <property ref="realm1"/> </bean> <!-- 生产SpringShiroFilter ( 持有shiro的过滤相关规则,可进行请求的过滤校验,校验请求是否合法 ) --> <bean> <property ref="securityManager"/> <property value="/user/login/page"/> <property value="/error.jsp"/> <property> <value> /user/query=anon /user/insert=authc,roles["banfu"] /user/update=authc,perms["student:update"] /order/insert=authc,roles["xuewei"] /user/logout=logout </value> </property> </bean> 6.3 web.xml <!-- 会从spring工厂中获取和它同名的bean,(id="shiroFilter") 接到请求后调用bean的doFilter方法,进行访问控制。 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- EnvironmentLoaderListener不再需要,因为shiro环境已由spring初始化 springMVC,spring配置不变 --> 七、记住我在登录后,可以将用户名存在cookie中,下次访问时,可以先不登录,就可以识别身份。
在确实需要身份认证时,比如购买,支付或其他一些重要操作时,再要求用户登录即可,用户体验好。
由于可以保持用户信息,系统后台也可以更好的监控、记录用户行为,积累数据。
7.1 代码”记住我“ 起点在登录时刻:Subject.login(UsernameAndPasswordToken)
而是否确定要“记住我”,由登录时的token控制开关:token.setRememberMe(true);
Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); //如果需要记住我的话,需要在token中设置 token.setRememberMe(true);//shiro默认支持”记住我“,只要有此设置则自动运作。 subject.login(token); 7.2 效果登录后效果
7.3 页面中显示在页面中显示,cookie中记录的用户信息
<shiro:user> 当有记住我信息,或已登录,则显示标签体内容
<shiro:principal> 获取用户信息