1 前 言
最近在使用 SpringBoot+Vue+Shiro 练习,但写到登录模块时,却遇到了 session 无法保存的问题,也就是前端提交登录请求后,后台通过 subject.login(usernamePasswordToken)
登录认证完响应给前端,但是前端想再请求后台判断是否登录时 (登录响应时我没有使用 Vuex 保存登录响应的数据) subject.isAuthenticated()
一直为 false
。
提示: 若你所遇到的情况与上述类似,请查看一下前端Vue组件是否配置以下代码,这样可以不耽误你的时间,因为本文最后的解决办法就是加入以下代码。而本文后面的代码及说明只是博主用来进行详细记录的。
//前端每次发送请求时就会带上 sessionId
axios.defaults.withCredentials = true
再次申明:请注意上面的提示,这将节省你的时间,如果你有兴趣,可以继续查看以下内容,以下还含有一些关于shiro的配置信息 |
---|
2 具体情况
2.1 shiro 部分
AdminRealm.java: 自定义的realm,只做了认证,未实现授权
public class AdminRealm extends AuthorizingRealm {
@Autowired
private AdminService adminService;
/**
* 授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
return simpleAuthorizationInfo;
}
/**
* 获取认证信息,根据 token 中的用户名从数据库中获取密码、盐等并返回
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String username = authenticationToken.getPrincipal().toString();
Admin admin = adminService.getAdminByUsername(username);
if (ObjectUtils.isEmpty(admin)) {
throw new UnknownAccountException();
}
String passwordFromDB = admin.getPassword();
String salt = admin.getSalt();
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, passwordFromDB, ByteSource.Util.bytes(salt), getName());
return authenticationInfo;
}
}
ShiroConfig.java: shiro 配置,因为没有做授权,这里的过滤器就没有配置
@Configuration
public class ShiroConfig {
@Bean
public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
/**
* Filter工厂,设置对应的过滤条件和跳转条件
* @param securityManager
* @return
*/
@Bean
public ShiroFilterFactoryBean shiroFilter<