Shiro整合SpringMVC之web搭建

项目框架:Spring + SpringMvc + Shiro + Mybatis + Redis

本章的源码地址:https://download.csdn.net/download/baidu_24352355/10476943

Shiro认证与授权的在Web中实现

第一步:添加依赖


   
     org.apache.shiro
     shiro-core
     1.4.0
   
   
     org.apache.shiro
     shiro-spring
     1.4.0
   


第二步:配置web.xml


  
    shiroFilter
    org.springframework.web.filter.DelegatingFilterProxy
    
    
      targetFilterLifecycle
      true
    
  
  
    shiroFilter
    /*
  
  

第三步:自定义Realm继承AuthorizingRealm,重写AuthorizationInfo(授权)和AuthenticationInfo(认证)



       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    
          class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        
        
        
        
            
                /login.jsp = anon
                /subLogin = anon
                /testRoles = roles["admin"]
                /testRoles1 = rolesOr["admin","admin1"]
                /testPerms = perms["user:delete"]
                /testPerms1 = perms["user:delete","user:updata"]
                /* = authc
            
        
        
            
                
            
        
    

    
    

    
    
          class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        
        
        
        
    

    
    
        
    

    
        
        
    
    
    
        
    

    

    

    
    
        
    

    
        
        
    

一些属性的意义:

  • securityManager: 这个属性是必须的。

  • loginUrl: 没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。

  • successUrl: 登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。

  • unauthorizedUrl: 没有权限默认跳转的页面。

Shiro中默认的过滤器:

过滤器名称 过滤器类 描述
anon org.apache.shiro.web.filter.authc.AnonymousFilter 匿名过滤器
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter 如果继续操作,需要做对应的表单验证否则不能通过
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter 基本http验证过滤,如果不通过,跳转屋登录页面
logout org.apache.shiro.web.filter.authc.LogoutFilter 登录退出过滤器
noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter 没有session创建过滤器
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter 权限过滤器
port org.apache.shiro.web.filter.authz.PortFilter 端口过滤器,可以设置是否是指定端口如果不是跳转到登录页面
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter http方法过滤器,可以指定如post不能进行访问等
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 角色过滤器,判断当前用户是否指定角色
ssl org.apache.shiro.web.filter.authz.SslFilter 请求需要通过ssl,如果不是跳转回登录页
user org.apache.shiro.web.filter.authc.UserFilter 如果访问一个已知用户,比如记住我功能,走这个过滤器

第五步:在spring-mvc.xml中配置权限的控制 异常的跳转






class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>

第六步:在controller中测试使用的验证登录

@RequestMapping(
			value="/subLogin", 
			method= RequestMethod.POST,
			produces="application/json;charset=utf-8")
	@ResponseBody
	public String subLogin(User user) {
		
		Subject subject = SecurityUtils.getSubject();
		
		UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
		
		try {
			token.setRememberMe(user.isRememberMe());
			subject.login(token);
		} catch (Exception e) {
			return e.getMessage();
		}
		
		// 编码方式判断是否具有管理员身份
		if (subject.hasRole("admin")) {
			return "有admin权限";
		}
		
		return "无admin权限";
	}


会话管理SessionManager

这里主要是结合了redis进行Sesssion的管理,自定义了RedisSessionDao


   
       
   

   

自定义CustomSessionManager

/**
 * @author Luke
 * @date 2018/6/11.
 */
public class CustomSessionManager extends DefaultWebSessionManager {

    @Override
    protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
        Serializable sessionId = getSessionId(sessionKey);
        //获取request
        ServletRequest request = null;
        if (sessionKey instanceof WebSessionKey) {
            request = ((WebSessionKey) sessionKey).getServletRequest();
        }
        //若request不为空,并且sessionID不为空,则从request中获取session
        if (request != null && sessionId != null) {
            Session session = (Session) request.getAttribute(sessionId.toString());
            //获取到的session不为空,则返回
            if (session != null) {
                return session;
            }
        }

        //否则从redisSessionDao中获取session
        Session session = super.retrieveSession(sessionKey);
        //若获取的session不为空,则设值到request的作用域中
        if (request != null && sessionId != null) {
            request.setAttribute(sessionId.toString(), session);
        }

        return session;
    }
}

缓存管理CacheManager,也是结合Redis,从redis中获取缓存数据,提高性能


public class RedisCacheManager implements CacheManager {

    @Autowired
    private RedisCache redisCache;

    @Override
    public  Cache getCache(String s) throws CacheException {
        return redisCache;
    }
}


只贴出部分源码,详细的请下载源码运行,内含sql脚本(resources/shiro.sql)

本文来自:Shiro整合SpringMVC之web搭建

更多博客请查看个人博客:https://blog.luke-lu.cn


你可能感兴趣的:(shiro,Shiro)