spring security国际化及UserCache的配置和使用

  1. Spring Security国际化配置:

要实现Spring Security的国际化,需要进行以下配置:

(1)在Spring Security的配置文件中增加MessageSourceBean的配置,并将其注入到Spring Security的配置中:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MessageSource messageSource;

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/home")
            .permitAll()
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
            .exceptionHandling()
            .accessDeniedPage("/403")
            .and()
            .csrf().disable();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/webjars/**","/css/**","/js/**");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user")
            .password("{noop}password")
            .roles("USER");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("language");
        registry.addInterceptor(localeChangeInterceptor);
    }

    @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
        cookieLocaleResolver.setDefaultLocale(Locale.ENGLISH);
        cookieLocaleResolver.setCookieName("language");
        cookieLocaleResolver.setCookieMaxAge(3600);
        return cookieLocaleResolver;
    }

    @Bean
    public AuthenticationSuccessHandler authenticationSuccessHandler() {
        SavedRequestAwareAuthenticationSuccessHandler authenticationSuccessHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        authenticationSuccessHandler.setTargetUrlParameter("targetUrl");
        return authenticationSuccessHandler;
    }

    @Bean
    public AuthenticationFailureHandler authenticationFailureHandler() {
        SimpleUrlAuthenticationFailureHandler authenticationFailureHandler = new SimpleUrlAuthenticationFailureHandler();
        authenticationFailureHandler.setUseForward(true);
        authenticationFailureHandler.setDefaultFailureUrl("/login?error");
        return authenticationFailureHandler;
    }
}

(2)在项目的资源文件中增加messages.properties和messages_zh_CN.properties两个文件,分别用于英语和中文语言环境的国际化支持。

messages.properties

login.title=Login Page
login.username=Username
login.password=Password
login.signIn=Sign in
login.language=Language
home.title=Home Page
home.welcome=Welcome, {0}!
403.title=Access Denied
403.message=Sorry, you do not have permission to access this page.

messages_zh_CN.properties

login.title=登录页
login.username=用户名
login.password=密码
login.signIn=登录
login.language=语言
home.title=主页
home.welcome=欢迎,{0}!
403.title=拒绝访问
403.message=对不起,你没有权限访问这个页面。

(3)在页面中添加语言环境的切换按钮,并实现其功能,即控制语言环境参数的传递。

<div class="language-switch">
    <a href="?language=en">English</a>
    <span>|</span>
    <a href="?language=zh_CN">中文</a>
</div>
  1. UserCache的配置和使用:

UserCache主要用于在一个会话中缓存用户信息,主要配置如下:

(1)在Spring Security的配置文件中增加UserCacheBean的配置,并将其注入到Spring Security的配置中:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserCache userCache;

    @Bean
    public UserCache userCache() {
        return new HttpSessionUserCache();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/home")
            .successHandler(authenticationSuccessHandler())
            .failureHandler(authenticationFailureHandler())
            .permitAll()
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
            .exceptionHandling()
            .accessDeniedPage("/403")
            .and()
            .csrf().disable();
    }
}

(2)在登录成功后,通过UserCache缓存用户信息:

@Service
public class AuthenticationUserDetailsService implements UserDetailsService {

    @Autowired
    private UserCache userCache;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 查数据库获取用户信息
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException(username);
        }
        String password = user.getPassword();
        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
        UserDetails userDetails = new User(username, password, authorities);
        userCache.putUserInCache(userDetails);
        return userDetails;
    }
}

(3)在需要使用UserCache缓存的地方,通过UserCache获取缓存的用户信息:

@Controller
public class HomeController {

    @Autowired
    private UserCache userCache;

    @GetMapping("/home")
    public String home(Model model) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String username = authentication.getName();
        UserDetails userDetails = userCache.getUserFromCache(username);
        String welcomeMessage = messageSource().getMessage("home.welcome", new Object[]{userDetails.getUsername()}, LocaleContextHolder.getLocale());
        model.addAttribute("welcomeMessage", welcomeMessage);
        return "home";
    }
}

在以上代码中,我们通过UserCache缓存登录成功后的用户信息,在HomeController中的home方法中,通过UserCache获取缓存的用户信息,然后从国际化的资源文件中获取欢迎信息,并添加到model中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring security国际化及UserCache的配置和使用 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 在JSP中使用formatNumber控制要显示的小数位数方法

    在JSP中,可以使用<fmt:formatNumber>标签来控制数字的显示格式,包括小数位数。 步骤如下: 在JSP页面中引入JSTL标签库: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@tagli…

    Java 2023年6月15日
    00
  • java开发之基于Validator接口的SpringMVC数据校验方式

    一、什么是Validator接口 Validator 接口是 Spring Framework 里面的一组校验接口,它实现了数据的校验功能。当我们在使用 SpringMVC 框架开发 web 项目时,需要进行表单数据的校验。为了降低代码复杂度和提高代码的可读性和可维护性,我们可以使用 Validator 接口对表单数据进行校验。 二、使用 Validator…

    Java 2023年5月20日
    00
  • Spring Security使用数据库登录认证授权

    下面我将为您讲解如何使用Spring Security实现数据库登录认证和授权。 一、引入依赖 首先,需要在pom.xml文件中引入Spring Security依赖: <dependency> <groupId>org.springframework.security</groupId> <artifactId&g…

    Java 2023年6月3日
    00
  • java 中ThreadLocal本地线程和同步机制的比较

    Java 中 ThreadLocal 本地线程和同步机制的比较 在 Java 程序中,线程安全是非常重要的话题。在多线程编程中,为了避免资源被多个线程同时访问而导致的数据不一致等问题,我们需要使用到同步机制。而 ThreadLocal 则是用来解决线程安全问题的另外一种方案。在本文中,我们将对 ThreadLocal 和同步机制进行比较,并且分别讨论它们的优…

    Java 2023年5月19日
    00
  • Java面试之Mybatis面试题吐血整理

    Java面试之Mybatis面试题吐血整理是一篇关于Mybatis面试题的文章,旨在帮助Java开发者更好地理解Mybatis框架,并为他们在面试中顺利通过Mybatis相关的技术问题。以下是关于攻略的详细讲解: 文章介绍 在文章介绍中,需要对该篇文章的主旨进行阐述,即为作者整理了一份Mybatis面试题,而这些问题都是在实际工作或者面试中遇到的问题。文章也…

    Java 2023年5月20日
    00
  • java object 之clone方法全面解析

    Java对象之clone方法全面解析 简介 在Java中,如果使用赋值号将一个对象赋值给另外一个对象,那么这两个对象会共用同一份数据。而通过clone()方法可以创建一个新的对象,并复制原始对象数据到新对象中。 在本篇文章中,我们将全面解析clone()方法,介绍如何使用clone()方法拷贝一个Java对象。 clone() 方法说明 clone()方法是…

    Java 2023年5月26日
    00
  • java 重定义数组的实现方法(与VB的ReDim相像)

    问题:详细讲解“java 重定义数组的实现方法(与VB的ReDim相像)”的完整攻略,过程中至少包含两条示例说明。 回答: 在Java中,数组的长度一旦确定后是不可变的,但有些情况下可能需要动态地改变数组的长度,这就需要对数组进行重新定义。本文将介绍Java中重定义数组的实现方法(与VB的ReDim相似)。 方法一:使用Arrays.copyOf方法 Arr…

    Java 2023年5月26日
    00
  • 基于java中集合的概念(详解)

    基于java中集合的概念(详解) 在Java中,集合是一组对象的容器。它们被设计为用于操作一组对象,而不是一个单独的对象。Java中的集合框架提供了一组接口和类,用于存储和操作对象的集合。在本文中,我们将详细讲解Java中集合概念的完整攻略。 集合框架 Java集合框架包括集合、列表、映射、队列和栈等不同的接口和类。这些接口和类提供了存储和操作集合的方法。 …

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部