apacher shiro

ShiroFilterFactoryBean注入SecurityManager LoginUrl UnauthorizedUrl FilterChainDefinitionMap 拦截器返回登录页面

认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁??
授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能做什么??

常见的权限控制方式
1 URL拦截权限控制:底层基于拦截器或者过滤器实现
2 方法注解权限控制:底层基于代理技术实现,为Action创建代理对象,由代理对象进行权限校验
过滤器名称 过滤器类 描述

简写类名作用
anonorg.apache.shiro.web.filter.authc.AnonymousFilter匿名过滤器
authcorg.apache.shiro.web.filter.authc.FormAuthenticationFilter如果继续操作,需要做对应的表单验证否则不能通过
authcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter基本http验证过滤,如果不通过,跳转屋登录页面
logoutorg.apache.shiro.web.filter.authc.LogoutFilter登录退出过滤器
noSessionCreationorg.apache.shiro.web.filter.session.NoSessionCreationFilter没有session创建过滤器
permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter权限过滤器
portorg.apache.shiro.web.filter.authz.PortFilter端口过滤器,可以设置是否是指定端口如果不是跳转到登录页面
restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilterhttp方法过滤器,可以指定如post不能进行访问等
rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter角色过滤器,判断当前用户是否指定角色
sslorg.apache.shiro.web.filter.authz.SslFilter请求需要通过ssl,如果不是跳转回登录页
userorg.apache.shiro.web.filter.authc.UserFilter如果访问一个已知用户,比如记住我功能,走这个过滤器

Application Code:应用程序代码,由开发人员负责开发的
Subject:框架提供的接口,代表当前用户对象
SecurityManager:框架提供的接口,代表安全管理器对象
Realm:可以开发人员编写,框架也提供一些,类似于DAO,用于访问权限数据
认证流程
认证流程
web.xml

<!-- 配置spring框架提供的用于整合shiro框架的过滤器 filter-name为spring.xml的bean-->
<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>

applicationContext.xml

<!-- 配置shiro框架的过滤器工厂对象 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<!-- 注入安全管理器对象 -->
		<property name="securityManager" ref="securityManager"/>
		<!-- 注入相关页面访问URL -->
		<property name="loginUrl" value="/login.jsp"/>
		<property name="successUrl" value="/index.jsp"/>
		<property name="unauthorizedUrl" value="/unauthorized.jsp"/>
		<!--注入URL拦截规则 和注解一样 -->
		<property name="filterChainDefinitions">
			<value>
				/css/** = anon
				/js/** = anon
				/images/** = anon
				/validatecode.jsp* = anon
				/login.jsp = anon
				/userAction_login.action = anon
				/page_base_staff.action = perms["staff-list"]
				/* = authc
			</value>
		</property>
	</bean>
	
	<!-- 注册安全管理器对象 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
	    <!-- realm -->
		<property name="realm" ref="bosRealm"/>
		<!-- 注入缓存管理器 -->
		<property name="cacheManager" ref="cacheManager"/>
	</bean>
	
	<!-- 注册缓存管理器 -->
	<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
		<!-- 注入ehcache的配置文件 -->
		<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
	</bean>
	
	<!-- 注册realm -->
	<bean id="bosRealm" class="com.itheima.bos.realm.BOSRealm">(BOSRealm extends AuthorizingRealm)
	</bean>
	
	<!-- 开启shiro框架注解支持 -->
	<bean id="defaultAdvisorAutoProxyCreator" 
		class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
			<!-- 必须使用cglib方式为Action对象创建代理对象 -->
		<property name="proxyTargetClass" value="true"/>
	</bean>
	
	<!-- 配置shiro框架提供的切面类,用于创建代理对象 -->
	<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
	
//注解
@RequiresPermissions("aaaa")
shiro的标签库
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<shiro:hasPermission name="aaaa">
/**
     * 用户登录,使用shiro框架提供的方式进行认证操作
     */
    public String login(){
        //从Session中获取生成的验证码
        String validatecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
        //校验验证码是否输入正确
        if(StringUtils.isNotBlank(checkcode) && checkcode.equals(validatecode)){
            //使用shiro框架提供的方式进行认证操作
            Subject subject = SecurityUtils.getSubject();//获得当前用户对象,状态为“未认证”
            AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword()));//创建用户名密码令牌对象
            try{
                subject.login(token); ---------------------------------------------------BOSRealm
            }catch(Exception e){
                e.printStackTrace();
                return LOGIN;
            }
            User user = (User) subject.getPrincipal();
            ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);
            return HOME;
        }else{
            //输入的验证码错误,设置提示信息,跳转到登录页面
            this.addActionError("输入的验证码错误!");
            return LOGIN;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值