shiro权限控制中第三方登录及其跨域总结

一:概述:

      在shiro中,接收到权限验证时,会生产唯一的sessionid,权限信息会保存在后端中(一般保存在redis中),并将sessionid写入前端,如果是链接请求,则需要返回sessionid,并将sessionid放在后期的访问头中。

      1.在同一个spring-cloud中: 

        在spring-cloud中,使用前端调用shiro验证接口后,接口会生成唯一的sessionid并隐性的将sessionid通过响应头写入前端浏览器,前端每次请求后台的数据,请求头中会自动添加sessionid提供给后shiro进行验证。

      2.第三方登录验证

        如果是第三方请求的话,必须在请求中设置withCredentials: true,否则由于跨域问题,每次请求都会生成一个新的sessionid,导致登录失败。

        3.链接请求:

           如果不是浏览器请求,而是链接请求登录验证时,则登录接口必须返回sessionid,并在后面的请求中,将这个sessionid写入到请求的头中即可。

二:实操:

        在spring-cloud中登录后,框架已经解决了shiro的跨域问题,但是当需要第三方登录时,怎么解决跨域问题呢,下面直接填等三方登录中ajax请求的代码如下:

1.前端请求代码:

$.ajax({

url: 'http://192.168.1.11:88/Login',
type: 'post',
data: 'username=admin&password=123456',
xhrFields: {
   withCredentials: true
},
crossDomain: true,
headers : {  
'Content-Type' : 'application/x-www-form-urlencoded'  
},
success: function (data) {
console.log(data);
$.ajax({
url:'http://192.168.1.11:88/gate-manage/menu/list',
type:'GET',
xhrFields: {
   withCredentials: true
},
crossDomain: true,
success:function(data){
}
});
}

});

其中在第三方登台登录时,使用ajax请求登录接口:

xhrFields: {

withCredentials: true
},

crossDomain: true,

前端与后端接口即可保存跨域访问。

2.后端第三方登录接口

        需要通过用户名和用户密码调用shrio验证的方法,并返回相应的sessionid,sessionid是在单纯链中需要用,组织到请求头中。如果是浏览器请求的话,并不需要返回seesionid,而是后端shiro自动写入了相应的浏览器中。

 @CrossOrigin(methods = {RequestMethod.POST}, origins = "*",allowCredentials="true")
@RequestMapping(value = "/Login", method = RequestMethod.POST)
@LoggerManage(description = "登录")
public Map<String, Object> Login(@RequestParam Map<String, Object> params,HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
if (params.get("username") == null || params.get("password") == null) {
map.put(CommonConstant.RESULT_CODE, ErrorCode.ERRORCODE_1003.getRetCode());
map.put(CommonConstant.RESULT_MSG, ErrorCode.ERRORCODE_1003.getRetMsg());
logger.info("返回结果:" + map);
return map;
}
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(params.get("username").toString(),
params.get("password").toString());
try {
// 进入shiro的认证流程
subject.login(token);
Session session = subject.getSession();
//System.out.println("sessionId="+session.getId());
map.put(CommonConstant.RESULT_CODE, ErrorCode.ERRORCODE_1000.getRetCode());
map.put(CommonConstant.RESULT_MSG, session.getId());
} catch (AuthenticationException e) {
token.clear();
map = isException(e.getClass().getName());
}
logger.info("返回结果:" + map);
return map;
}

猜你喜欢

转载自blog.csdn.net/kunzai6/article/details/80527130
今日推荐