项目权限控制的管家——Apache Shiro框架

在学习Apache Shiro框架之前,我们要清楚ApacheShiro框架能够帮助我们完成什么功能呢?以下就是Apache Shiro框架所能做的事情:

1、  验证用户。

2、  在任何环境下都可以使用SessionAPI。

3、  可以使用多个用户数据库。例如一个是oracle数据库,另外一个是masql数据库。

4、  对用户执行访问控制,如:判断用户是否拥有角色admin或者判断用户时候拥有访问的权限。

5、  单点登录(sso)功能

Apache Shiro框架提供的权限控制的方式:

1、  url拦截器进行权限控制(框架提供了很多过滤器进行url拦截)

2、  方法注解进行权限控制(框架提供了在方法上使用的注解,为Action创建代理对象,进行权限控制)

3、  页面标签权限控制(框架提供了一套完整标签,用于根据权限展示或者隐藏按钮或者菜单)

4、  代码级别权限控制(不常使用)

以下是我从网上找到的一个Shiro框架执行流程图:

Application Code:应用程序代码,由开发人员负责开发

Subject:当前用户

SecurityManager:安全管理器,管理所有的用户,认证、授权等。

Realm:安全数据桥,类似于Dao,负责访问安全数据(安全的是数据指用户名 密码 权限等。)

shiro框架在项目中的应用:

第一步:在web.xml中配置一个过滤器代理对象。

 <!-- 加入spring框架提供的过滤器代理对象(配置shiroFilter) -->
 <filter>
  	<filter-name>shiroFilter</filter-name>
  	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>shiroFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping> 

第二步:在spring配置文件中配置一个名称为shiroFilter的bean。

<!-- 配置shiro的bean -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<!-- 注入安全管理对象 -->
		<property name="securityManager" ref="securityManager"></property>
		<!-- 登陆页面url的地址 -->
		<property name="loginUrl" value="/login.jsp"></property>
		<!-- 成功登陆跳转的页面 -->
		<property name="successUrl" value="/index.jsp"></property>
		<!-- 权限不足跳转的页面 -->
		<property name="unauthorizedUrl" value="/unauthorized.jsp"></property>
		<!-- 基于url拦截,使用过滤器进行拦截 -->
		<property name="filterChainDefinitions">
			<value>
				/css/** = anon    <!-- anon代表可以直接访问,就是匿名访问 -->
				/images/** = anon
				/js/** = anon
				/validatecode.jsp* = anon
				/login.jsp = anon
				/userAction_login.action = anon
				/page_base_staff.action = perms["staff"]   <!-- 不光需要登陆,还需要权限 -->
				/** = authc       <!-- 登陆完认证之后才能访问 -->
			</value>
		</property>
	</bean>
	<!-- 安全管理对象 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="bosRealm"></property>   <!-- 自定义的realm类 -->
	</bean>
	<bean id="bosRealm" class="cn.itcast.bos.shiro.BOSRealm"></bean>
在配置文件中我们配置了一个bosRealm类,这个bosRealm类就是Shiro框架的核心部分,下面我们通过登录代码来演示一下。

BOSRealm类必须继承AuthorizingRealm类,它里面主要有两个方法,一个是认证的,另一个是授权的。

	//认证
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		//获取到令牌
		UsernamePasswordToken myToken = (UsernamePasswordToken)token;
		//获取到令牌中的用户名
		String username = myToken.getUsername();
		//获取到令牌中的密码
		char[] password = myToken.getPassword();
		//从数据库中根据用户名查询用户
		User user = (User) userDao.findByUsername(username);
		if (user==null) {
			return null;
		}
		//将查询到的用户保存到info,返回到权限管理器中。
		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());
		
		return info;
	}

//授权
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		//获得信息对象
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		//信息对象授予相应的权利
		info.addStringPermission("staff");
		return info;
	}

下面是用户登录的密码

//用户登录
	public String login(){
		//判断验证码是否正确
		String vcheckcode = (String)ServletActionContext.getRequest().getSession().getAttribute("key");
		if(StringUtils.isBlank(checkcode) || !checkcode.equals(vcheckcode)){
			this.addActionError(this.getText("checkcodeError"));
			return "login";
		}else{
			//获得当前用户
			Subject subject = SecurityUtils.getSubject();
			//获得输入的用户名
			String username = model.getUsername();
			//获得输入的密码
			String password = model.getPassword();
			//md5加密密码
			password = MD5Utils.md5(password);
			//获得令牌
			AuthenticationToken token = new UsernamePasswordToken(username,password);
			
			try {
				subject.login(token);//调用安全管理器,由安全管理器去调用realm
				//获取BOSRealm中的user
				User user = (User)subject.getPrincipal();
				//将user保存到session中
				ServletActionContext.getRequest().getSession().setAttribute("user", user);
			} catch (UnknownAccountException e) {
				e.printStackTrace();
				this.addActionError("用户名不存在");
				return "login";
			} catch(IncorrectCredentialsException e){
				this.addActionError("密码错误");
				return "login";
			}
			
		}
		
		return "index";
	}
在这里我们可以知道shiro框架是使用抛出不同的异常来实现认证的。

以上就是关于Shiro框架的知识和应用,希望能给各位程序员提供一些帮助





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值