老的SpringMVC项目接入shiro步骤

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baiyun8789/article/details/86713077

最近新接手了一个老项目。之前没有任何的权限管理。现在想接入shiro把权限这块管理起来。

关于shiro网上的资料已经很多了,我就不重复了。

直接开搞。

1,引入依赖

 
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.2.5</version> </dependency> 

这一个就行了

2,修改web.xml

因为是个老的SpringMVC项目,要改的xml配置还不少。先要在web.xml中配置shiro过滤器,接管所有请求。

 
<!-- 使用shiro认证 --> <!-- 配置Shiro的过虑器,如果与Spring集成,则必须要使用Shiro提供的过虑器代理 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <!-- 指定SpringBean代理Bean的名称,如果没有指定则与过虑器名称保持一致 --> <param-name>targetBeanName</param-name> <param-value>shiroFilter</param-value> </init-param> <init-param> <!-- 配置是否启动过虑器的init/destory方法 --> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> <!-- 配置如果没有权限,则跳转到的页面 --> <error-page> <exception-type>org.apache.shiro.authz.AuthorizationException</exception-type> <location>/login.htm</location> </error-page> <error-page> <exception-type>org.apache.shiro.authz.UnauthorizedException</exception-type> <location>/login.htm</location> </error-page> <!-- 使用shiro认证 结束 --> 

3,配置shiro的bean

 
<!-- shiro配置 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login.htm"/><!--登录页面,--> <property name="successUrl" value="/index.htm"/><!--登录成功页面,如果自己设置了返回页面,则不跳转--> <property name="unauthorizedUrl" value="/error.htm"/> <property name="filterChainDefinitions"> <value> /assets/**=anon /api/loginCheck=anon <!--表示都可以访问--> /api/register=anon /login=anon /**=authc <!--authc表示需要认证才能访问的页面--> </value> </property> </bean> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myshiroRealm"/> </bean> 

注释的内容我不重复,注意filterChainDefinitions这个,有一些路径比如登录注册等等是需要不加权限的,注意配置一下。

另外看这个myshiroRealm。多说一句,我开始也不理解为啥叫realm,后来查了下,realm是有域的意思,安全域。

这个类是需要我们自己创建的。

是整个shiro中需要我们编写的核心代码。简单的其实也就是查询数据库,比对用户名密码对不对。

4,编写shiroRealm

 
@Component("myshiroRealm") public class MyShiroRealm extends AuthorizingRealm { @Autowired @Qualifier("permissionService") private PermissionService permissionService; @Autowired @Qualifier("userService") private UserService userService; @Autowired @Qualifier("roleService") private RoleService roleService; /** * 权限检查 */ protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { // 做权限检查 。。。 } /** * 登录认证举例 */ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; //通过表单接收的用户名 String username = token.getUsername(); char[] password = token.getPassword(); User userByUsername = userService.getUserByUsername(username); if (null == userByUsername) { throw new AccountException("账户不存在"); } User user = userService.getUserByPwd(username, String.valueOf(password)); if (null == user) { throw new AccountException("帐号或密码不正确!"); } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } } 

以登录认证举例。

5,在登录流程中使用

 
/** * 登录校验 */ @RequestMapping(value = "loginCheck", method = RequestMethod.POST) public RestfulResponse loginCheck(@RequestBody Map<String, String> params) { RestfulResponse restfulResponse = new RestfulResponse(); restfulResponse.setSuccess(false); String username = params.get("username"); String password = params.get("password"); //登录后存放进shiro token UsernamePasswordToken token = new UsernamePasswordToken(username, password); Subject subject = SecurityUtils.getSubject(); try { subject.login(token); restfulResponse.setSuccess(true); restfulResponse.setMsg("认证成功"); } catch (AuthenticationException e) { e.printStackTrace(); restfulResponse.setMsg(e.getMessage()); } return restfulResponse; } 

重点的代码就是subject.login(token),底层会调我们上面编写的realm进行校验

好了,到现在为止,对shiro在java后端代码中的使用基本流程就通了。

Subject subject = SecurityUtils.getSubject();这个特别好用,只要登录了,在以后的代码中,都可以从这一句获取登录信息。

6,velocity中使用shiro

我这个项目页面是velocity写的,我想在vm中也是用shiro标签也是可以的。做法:

 
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver"> <property name="cache" value="false"/> <property name="prefix" value="/templates/"/> <property name="layoutUrl" value="/layout/main.vm"/> <property name="suffix" value=".vm"/> <property name="exposeSpringMacroHelpers" value="true"/> <property name="contentType" value="text/html;charset=UTF-8"/> <property name="viewClass" value="org.springframework.web.servlet.view.velocity.VelocityLayoutView"/> <!--自定义工具--> <property name="toolboxConfigLocation" value="WEB-INF/views/velocity-tools.xml"/> </bean> 

我找到之前的viewResolver,然后加了一个自定义工具velocity-tools

7,自定义工具

到WEB-INF下创建这个自定义工具

 
<?xml version="1.0" encoding="UTF-8"?> <toolbox> <tool> <key>shiro</key> <scope>request</scope> <class> com.github.ltsopensource.admin.support.VelocitySupport </class> </tool> </toolbox> 

也很简单,就是指向我的一个工具类VelocitySupport

8,velocity工具类

来看看这个工具类的内容

实际上有很多方法,我这里那最简单的用户名举例

@DefaultKey("shiro") @ValidScope(Scope.APPLICATION) public class VelocitySupport { /** * 返回用户 Principal。 * * @return 用户 Principal */ public Object getPrincipal() { Subject subject = SecurityUtils.getSubject(); return subject != null ? subject.getPrincipal() : null; } 

整个类内容,参考:https://github.com/eduosi/shiro-velocity-support

9.在vm模板中使用

这样就好了

更多shiro的用法请搜索相关教程

猜你喜欢

转载自blog.csdn.net/baiyun8789/article/details/86713077