gpt4 book ai didi

java - AngularJS 和 Spring MVC 安全性

转载 作者:行者123 更新时间:2023-11-30 17:06:51 28 4
gpt4 key购买 nike

我有一个用 AngularJS 编写的前端和一个 Spring MVC 后端。我的想法是只保护 REST API 服务,并在进行未经授权的服务调用时使用 AngularJS 中的拦截器将用户重定向到登录页面。我现在面临的问题是,在调用服务时,页面会在用户重定向之前短暂显示。我能做些什么吗?还是这种方法存在根本性缺陷?

这是拦截器:

$httpProvider.interceptors.push(function ($q, $location) {
return {
'responseError': function(rejection) {
var status = rejection.status;

if (status == 401 || status == 403) {
$location.path( "/login" );
} else {
}

return $q.reject(rejection);
}
};});

我的安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private CustomUserDetailsService customUserDetailsService;

@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().authenticated();
}

@Bean(name="myAuthenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

}

登录 Controller :

@RequestMapping(value = "/login", method = RequestMethod.POST, produces="application/json")
@ResponseBody
public String login(@RequestBody User user) {
JSONObject result = new JSONObject();
UsernamePasswordAuthenticationToken token =
new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());

try {

Authentication auth = authenticationManager.authenticate(token);
SecurityContext securityContext = SecurityContextHolder.getContext();
securityContext.setAuthentication(auth);
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpSession session = attr.getRequest().getSession(true);
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);

result.put("isauthenticated", true);
} catch (BadCredentialsException e) {
result.put("isauthenticated", false);
}

return result.toString();
}

最佳答案

我认为这种方法没问题,但您可能不得不忍受页面闪烁,这反过来意味着您必须优雅地处理它。

我猜页面刷新大致如下:

  • 进行导航,呈现模板并为新路线激活 Controller
  • Controller 调用服务;这是异步的,所以显示没有任何数据的页面
  • 服务返回 401/403,它被拦截,并出现到登录页面的新导航

你可能想试试:

  1. 在路由的 resolve 配置中收集页面所需的所有数据(ngRouteangular-ui-router 都支持),以便在获取所有数据之前导航不会完成。
  2. 在页面内处理它:当服务调用仍处于挂起状态时,显示一个微调器/消息,让用户知道某些后台 Activity 正在进行。
  3. 当拦截器捕获到 401/403 时,让它打开一个模式弹出窗口,解释情况并提供用户登录或导航到登录页面作为一个选项。将其与微调器/消息相结合。

关于java - AngularJS 和 Spring MVC 安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27823047/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com