shiro从建库到运行
2018-01-24 21:22
79 查看
shiro是面向方法级别的安全管理框架,灵活好用,可以非常优雅的处理authentication(身份验证)、authorization(授权)、enterprise session(企业会话)和cryptography(加密)。
shiro可以干啥:
鉴别用户身份
管理用户权限
即使没有web容器,也可以使用session API
在鉴别用户身份、权限管理时或session生命周期内时进行一些操作
可以聚合一个或多个用户权限数据源并且以用户视图表现出来
单点登录功能、无需登录实现“记住我”功能
整合shiro和ssm有好几种方法,这里只列举一种:
1.数据库设计
user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nickname` varchar(20) DEFAULT NULL COMMENT '用户昵称',
`email` varchar(128) DEFAULT NULL COMMENT '邮箱|登录帐号',
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
`head_image` varchar(64) DEFAULT NULL,
`status` bigint(1) DEFAULT '1' COMMENT '1:有效,0:禁止登录',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表';role表
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`uid` bigint(20) DEFAULT NULL COMMENT '用户ID',
`rid` bigint(20) DEFAULT NULL COMMENT '角色ID'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表';role_permission表
DROP TABLE IF EXISTS `role_permission`;
CREATE TABLE `role_permission` (
`rid` bigint(20) DEFAULT NULL COMMENT '角色ID',
`pid` bigint(20) DEFAULT NULL COMMENT '权限ID'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表';user_role是控制user和role的对应关系,而role_permission是控制url的权限和角色的对应关系
2.配置shiro
shiro的配置网上千篇一律,就不往出贴代码了。写一下注意点:
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>保证实现了Shiro内部lifecycle函数的bean执行,不能忘记配置。
自定义的Realm实现了doGetAuthorizationInfo和doGetAuthenticationInfo方法,但是有时登陆验证是正常的而授权确不运行,/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username=(String)principals.getPrimaryPrincipal();
User user=userService.findUserByUserName(username);
SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
for(Role role : user.getRoleList()){
authorizationInfo.addRole(role.getName());
for(Permission permission : role.getPermissionList()){
authorizationInfo.addStringPermission(permission.getUrl());
}
}
return authorizationInfo;
}此时需要检查一下shiro的配置,很有可能少写或者漏写属性
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 表示捕获的异常 -->
<prop key="org.apache.shiro.authz.UnauthorizedException">
<!-- 捕获该异常时跳转的路径 -->
/login
</prop>
<prop key="org.apache.shiro.authz.UnauthenticatedException">
/login
</prop>
</props>
</property>
</bean>
shiro可以干啥:
鉴别用户身份
管理用户权限
即使没有web容器,也可以使用session API
在鉴别用户身份、权限管理时或session生命周期内时进行一些操作
可以聚合一个或多个用户权限数据源并且以用户视图表现出来
单点登录功能、无需登录实现“记住我”功能
整合shiro和ssm有好几种方法,这里只列举一种:
1.数据库设计
user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nickname` varchar(20) DEFAULT NULL COMMENT '用户昵称',
`email` varchar(128) DEFAULT NULL COMMENT '邮箱|登录帐号',
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
`head_image` varchar(64) DEFAULT NULL,
`status` bigint(1) DEFAULT '1' COMMENT '1:有效,0:禁止登录',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表';role表
DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL COMMENT '角色名称', `type` varchar(10) DEFAULT NULL COMMENT '角色类型', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='角色表';permission表
DROP TABLE IF EXISTS `permission`; CREATE TABLE `permission` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `url` varchar(256) DEFAULT NULL COMMENT 'url地址', `url_desc` varchar(64) DEFAULT NULL COMMENT 'url描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='url权限表';user_role表
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`uid` bigint(20) DEFAULT NULL COMMENT '用户ID',
`rid` bigint(20) DEFAULT NULL COMMENT '角色ID'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表';role_permission表
DROP TABLE IF EXISTS `role_permission`;
CREATE TABLE `role_permission` (
`rid` bigint(20) DEFAULT NULL COMMENT '角色ID',
`pid` bigint(20) DEFAULT NULL COMMENT '权限ID'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表';user_role是控制user和role的对应关系,而role_permission是控制url的权限和角色的对应关系
2.配置shiro
shiro的配置网上千篇一律,就不往出贴代码了。写一下注意点:
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>保证实现了Shiro内部lifecycle函数的bean执行,不能忘记配置。
自定义的Realm实现了doGetAuthorizationInfo和doGetAuthenticationInfo方法,但是有时登陆验证是正常的而授权确不运行,/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username=(String)principals.getPrimaryPrincipal();
User user=userService.findUserByUserName(username);
SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
for(Role role : user.getRoleList()){
authorizationInfo.addRole(role.getName());
for(Permission permission : role.getPermissionList()){
authorizationInfo.addStringPermission(permission.getUrl());
}
}
return authorizationInfo;
}此时需要检查一下shiro的配置,很有可能少写或者漏写属性
<!-- 开启切面编程自动代理 --> <aop:aspectj-autoproxy proxy-target-class="true"/> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>springmvc中一定要有开启aop编程和方法验证的配置,参照上述代码,此时shiro就可以正常运行和验证。如
@Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequiresPermissions("user:main") @RequestMapping("/main") public String main(){ return "main"; }user:main验证失败,无权限执行方法内程序,对异常捕获并跳转需要的页面,还是在springmvc中添加如下代码,对为授权失败的异常进行捕获并跳转。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 表示捕获的异常 -->
<prop key="org.apache.shiro.authz.UnauthorizedException">
<!-- 捕获该异常时跳转的路径 -->
/login
</prop>
<prop key="org.apache.shiro.authz.UnauthenticatedException">
/login
</prop>
</props>
</property>
</bean>
相关文章推荐
- shiro-入门,快速与springmvc整合,全注解,最简单让项目运行起来
- 运行apache shiro自带的samples时toolchain问题
- ssh+maven+annotation+shiro搭建运行用户登录权限验证代码demo下载
- 详解dbca建库生成的脚本的运行内容
- Apache Shiro的运行流程和权限控制方式分析
- Shiro原理以及运行流程
- JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题
- shiro原理及其运行流程介绍
- 详解dbca建库生成的脚本的运行内容
- shiro原理的分析,系统权限管理以及 运行流程分析
- C/C++变量编译时运行时分配内存
- C#查询系统运行进程,关闭进程,记录键盘按键记录
- java6调用运行javascript代码
- Android Studio系列教程二--基本设置与运行
- 直接以管理员身份运行bat代码
- java学习之编译时类型和运行时类型
- Apache Shiro 标签方式授权
- SpringMVC+Shiro权限管理
- Java运行时动态加载类之ClassLoader方法带参数
- Sample语言编译与运行及简单虚拟机器的设计实现