您的位置:首页 > 其它

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 `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