1. 程式人生 > >Online Judge(OJ)搭建——5、配置

Online Judge(OJ)搭建——5、配置

ngs cat wait logs authorize localhost dap config []

Spring

配置一些本地類,還有 HTML form 提交文件的解析器。

package per.piers.onlineJudge.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration;

@Configuration
public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{RootConfig.class, SecurityConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } @Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { registration.setMultipartConfig(new MultipartConfigElement("")); } }

Spring Security

Spring 需要從數據庫獲取權限相關數據,所以需要配置數據源。之後根據相關用戶身份,配置訪問的權限。

package per.piers.onlineJudge.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import javax.sql.DataSource;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private DataSource dataSource;

    @Autowired
    public SecurityConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .jdbcAuthentication().dataSource(dataSource)
                .usersByUsernameQuery("SELECT email, password, enabled FROM users WHERE email=?")                                                                        // password
                .authoritiesByUsernameQuery("SELECT email, role FROM users WHERE email=?");
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .authorizeRequests()
                // user
                .regexMatchers("/user/information").hasAnyAuthority("user","admin")
                // test
                .regexMatchers("/test/question/\\d+").hasAnyAuthority("user","admin")
                // score
                .regexMatchers("/score/.+").hasAnyAuthority("user","admin")
                // testManager
                .regexMatchers("/testManager/.+").hasAnyAuthority("admin")
                // others
                .anyRequest().permitAll().and() // set authorization matcher
                .formLogin().loginPage("/user/login").defaultSuccessUrl("/user/information").and()
                .rememberMe().tokenValiditySeconds(604800).key("OnlineJudge").and()
                .logout().logoutUrl("/user/logout").logoutSuccessUrl("/user/login");
    }

}

由於 Spring Security 的默認編碼是 ISO-8850-1,所以需要配置 CharacterEncodingFilter 把默認編碼變更為 UTF-8。

package per.piers.onlineJudge.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
import org.springframework.web.filter.CharacterEncodingFilter;

import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;

@Configuration
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        characterEncodingFilter.setInitParameter("encoding", "UTF-8");
        characterEncodingFilter.setInitParameter("forceEncoding", "true");
        characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
    }

}

MyBatis

在Online Judge(OJ)搭建——2、數據庫,SQL語句介紹過。

數據源

JNDI

在程序中,將數據源托管給專人負責,此為 JNDI 方式。這裏托管給 Tomcat 負責,在OnlineJudge/WEB-INF/META-INF/context.xml配置。這種方式將程序和數據庫鏈接解耦,推薦。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="mybatis"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="com.mysql.cj.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/online_judge?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=true"
              username="root"
              password="woaimysql-135"
              maxTotal="20"
              maxIdle="10"
              maxWaitMillis="10000"/>
</Context>

Online Judge(OJ)搭建——5、配置