shiro从建库到运行

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> 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值