发表于: 2017-07-22 23:29:57

2 1018


shiro与ssm整合进行登录及权限验证

1、非shiro准备

user role permission 三张表, user-role, role-permission均为多对多关系, 故添加userRole, rolePermission两表

用mybatis generator生成相应的domain, dao层并测试

部分需要的service层并测试, 也可以后来再写

2、shiro基本配置概述

<shiro.version>1.3.1</shiro.version>

<dependency>

    <groupId>org.apache.shiro</groupId>

    <artifactId>shiro-core</artifactId>

    <version>${shiro.version}</version>

</dependency>

<dependency>

    <groupId>org.apache.shiro</groupId>

    <artifactId>shiro-web</artifactId>

    <version>${shiro.version}</version>

</dependency>

<dependency>

    <groupId>org.apache.shiro</groupId>

    <artifactId>shiro-spring</artifactId>

    <version>${shiro.version}</version>

</dependency>

其他依赖详见GitHub pom文件

securityManager: 安全管理器, property必须添加realm, 可选添加sessionManager与cacheManager

realm: 必须实现的管理"授权信息"和"验证信息"的类, property必须添加credentialsMatcher, 可选添加cachingEnable等指定缓存是否开启

credentialsMatcher: 凭证(密码)匹配器, 可用shiro自带. property一般添加hashAlgorithmName为MD5, 可选添加hashIterations等

shiroFilter: shiro过滤器, 必须添加securityManager, 推荐添加filterChainDefinitions, 可选添加loginUrl等情况(如未验证)对应的url

filterChainDefinitions: 权限过滤器, 以键值对的方式记录各url所需权限, 如/admin/test=authc, perms[admin:test]  详见Google:filterChainDefinitions

cache/session/rememberMe暂未添加

3、登陆验证

从shiroFilter寻求securityManager, 到realm(必须自己实现)中的doGetAuthenticationInfo方法进行登陆验证

如上面代码所示返回值的参数分别是user中的name, pwd, salt及realm的名, 这里的user是通过service层从数据库得到的, 接下来这个return值被用于Subject的login校检见下:

需要注意的是创建user用户时, 需要对用户密码进行与shiro credentialsMatcher配置的同样的加密, 故创建加密工具类如下:

上面的SimpleHash, UsernamePasswordToken都是shiro自带的类

4、权限验证

从自实现的realm中获取授权信息的方法如下:

可以看到Roles和Permissions都是从数据库获得并加入到授权信息中

使用授权信息的验证方法有3种:

a) 上文2中有提到filterChainDefinitions是一种基础简单的用法

b) 在controller层方法中使用@RequiresRoles("admin")或@RequiresPermissions("p:get")也可

但需要配置aop相关的bean如下:

若需要进行异常处理, 可以自行添加异常处理的bean, 示例如下

 <bean class="cn.yxy.shiro.exception.handler.ShiroExceptionHandler"/>

c) jsp中使用shiro标签如<shiro:guest>, </shiro:user>等

可能需要permission匹配类当permission是以setObjectPermission被加入到authorizationInfo中时

最后

代码链接: https://github.com/wasax9t/shiro-ssm-demo

参考文章: http://jinnianshilongnian.iteye.com/category/305053

并感谢kaitao zhang的详细教程
ps: 现在日报从Typora直接复制不行了, 会吃字!!!



返回列表 返回列表
评论

    分享到