shiro框架使用中踩得坑,总结一下加深印象

Posted mssyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro框架使用中踩得坑,总结一下加深印象相关的知识,希望对你有一定的参考价值。

首先,说明运行环境,前后端分离,跨域。

先说一下跨域,跨域最好不要直接用注解形式,很麻烦,因为如果有需要设置的内容时还要一个一个找到注解更改,直接配置bean方便很多

 1     @Bean
 2     private CorsConfiguration buildConfig() {
 3         CorsConfiguration corsConfiguration = new CorsConfiguration();
 4         corsConfiguration.addAllowedHeader("*");
 5         corsConfiguration.addAllowedOrigin("*");
 7         corsConfiguration.addAllowedMethod("*");
 8         corsConfiguration.setMaxAge(3600L);         // 预检请求的有效期,单位为秒。
 9         corsConfiguration.setAllowCredentials(true);// 是否支持安全证书(必需参数)
10         return corsConfiguration;
11     }
12 
13     @Bean
14     public CorsFilter corsFilter() {
15         UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
16         source.registerCorsConfiguration("/**", buildConfig());
17         return new CorsFilter(source);
18     }

 

1.  跨域一般都会遇到能登陆但是不进授权的问题,因为shiro存储认证信息是在登录后存在浏览器的cookie中,访问授权接口时会从cookie中取出认证信息进行认证,但是跨域cookie传不到后台,用了另一种办法,把认证信息存在请求头中

https://www.cnblogs.com/elvinle/p/9272076.html-比较详细

用了这种方式后把会话管理器注册到DefaultWebSecurityManager ,这样登录后把认证信息放在响应头中返回,前端取出来放在请求头中发回来,就是从请求头中直接拿认证信息了

    @Bean(name = "sessionManager")
    public DefaultHeaderSessionManager sessionManager() {
        DefaultHeaderSessionManager sessionManager = new DefaultHeaderSessionManager();
        // 设置session过期时间3600s
        sessionManager.setGlobalSessionTimeout(3600000L);
        sessionManager.setSessionValidationInterval(3600000L);
        return sessionManager;
    }

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setSessionManager(sessionManager());
        securityManager.setRealm(myShiroRealm());
        return securityManager;
    }

 

  1.1 这里还有个小问题

       https://segmentfault.com/q/1010000019535285---比较详细

  在使用跨域的时候前端不能直接从响应头中取数据,为null。因为在使用跨域的方式进行前后端的交互时,浏览器只会使用默认的header。而认证信息是新添加的所以没效果,需要告诉浏览器,这个请求头数据要用,你得给前端才行

response.setHeader("key", token);
response.setHeader("Access-Control-Expose-Headers", "请求头的key");

这是在登陆后,把认证信息放入响应头后,添加这行代码,浏览器才会知道你要用,才能拿到

 

2. 暂时没二

以上是关于shiro框架使用中踩得坑,总结一下加深印象的主要内容,如果未能解决你的问题,请参考以下文章

appium+python3+pycharm踩得坑

SpringBoot 集成 Activiti 一路踩得坑

Ubuntu中安装FTP 服务器自己踩得坑

框架学习

2023最新pytorch安装教程,简单易懂,面向初学者(Anaconda+GPU)

接口HTTP请求协议响应(总结加深印象)