2016-07-19 5 views
0

Ich benutze Frühling Sicherheit in meinem Projekt und ich benutze benutzerdefinierte Authontiere. Ich speichere Benutzer vom Code.Wie kann ich die Hauptseite öffnen, wenn der Benutzer angemeldet ist und versucht, die Anmeldeseite zu öffnen? (Spring security)

@Override 
    public void saveUser(AuthLkUser lkUser) { 
     final List<GrantedAuthority> grantedAuths = new ArrayList<>(); 
     GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_USER"); 
     grantedAuths.add(grantedAuthority); 
     UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(lkUser.getMsisdn(), lkUser.getPricePlan(), grantedAuths); 
     SecurityContextHolder.getContext().setAuthentication(result); 
    } 

Es funktioniert normal. Aber nach erfolgreicher Anmeldung kann ich die Anmeldeseite erneut öffnen. Ich muss deaktivieren Möglichkeit Login-Seite nach Succseessufull Login. Ich versuchte dies:

.antMatchers("/login", "/default/login").access("hasRole('ANONYMOUS')") 

Aber Benutzer mit "USER" Rolle kann auch Login-Seite öffnen.

versuchte ich

@Component 
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler { 
    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException { 
     // initialization logic after login 

     // redirect 
     HttpSession session = request.getSession(); 
     SavedRequest savedReq = (SavedRequest) session.getAttribute("SAVED_REQUEST"); 
     if (savedReq == null) { 
      response.sendRedirect(request.getContextPath() + "/landing"); 
     } 
     else { 
      response.sendRedirect(savedReq.getRedirectUrl()); 
     } 
    } 
} 

und Setup

@Autowired 
    private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler; 

.successHandler(myAuthenticationSuccessHandler) 

Aber nach succsessufull Login diese Methode nicht aufgerufen config.

Wie kann ich die Hauptseite öffnen, wenn der Benutzer angemeldet ist und versucht, die Anmeldeseite zu öffnen?

und warum meine myAuthenticationSuccessHandler nicht genannt?

es ist meine Config

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .antMatchers("/", "/index").access("hasRole('USER')") 
//    .antMatchers("/login", "/default/login").access("hasRole('ANONYMOUS')") 
       .and() 
       .formLogin() 
       .loginPage("/login") 
       .loginProcessingUrl("/j_spring_security_check") 
       .successHandler(myAuthenticationSuccessHandler) 
       .permitAll(); 
     http.csrf() 
       .disable() 
       .authorizeRequests() 
       .antMatchers("/resources/**", "/**").permitAll() 
       .anyRequest().permitAll() 
       .and(); 
    } 
} 

Antwort

0

Ich glaube, Sie brauchen einen Controller hinzufügen, in dem Sie benötigen für die Anmeldung Anfrage prüfen, ob Benutzer bereits angemeldet ist oder nicht. Wenn nicht angemeldet, wird die Anmeldeseite sonst auf die Startseite umgeleitet. Im Anschluss an eine solche Probe Controller:

@Controller 
@RequestMapping("/") 
public class IndexController { 

    @RequestMapping(value="/login",method = RequestMethod.GET) 
    public String index(){ 

     if(SecurityUtils.isUserLoggedIn()) 
      return "redirect:/home"; 

     return "login"; 

    } 

} 

Und finden Probe SecurityUtils.java Klasse, die Utility-Klasse, die Methode ist zu prüfen, ob Benutzer angemeldet ist oder nicht ist:

public class SecurityUtils { 

    public static boolean isUserLoggedIn(){ 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     if(null != authentication){ 
      return (authentication.isAuthenticated() && !(authentication instanceof AnonymousAuthenticationToken)); 
     }else{ 
      return false; 
     } 

    } 
} 
+0

das ist genau das, was ich tat. aber ich denke, es ist eine schlechte Übung – user5620472

Verwandte Themen