彼ら。1 つ質問があります。リクエストを解決するための XML-RPC コントローラーと、ログイン実装のためのサービス (Spring Security UserDetails Service を実装) を備えたログイン アプリケーションを実装しています。ユーザーログインのデータは、DAO がアクセスする組み込みの mongodb データベースに保存されます。そのため、ログインすると、dao を使用したサービスがユーザーのデータベースにアクセスします。ただし、サービスを呼び出す瞬間に、DAO は初期化されません (null です)。私は何を間違っていますか?私のコントローラークラス:
@Controller
public class XmlRpcController {
private XmlRpcServletServer server;
@Autowired
private UserService userService;
@PostConstruct
public void init() throws XmlRpcException {
try {
System.out.println("Starting the server on port 8090");
XmlRpcServerConfigImpl config= new XmlRpcServerConfigImpl();
server=new XmlRpcServletServer();
server.setConfig(config);
PropertyHandlerMapping xmlRpcHandlerMapping=new PropertyHandlerMapping();
xmlRpcHandlerMapping.load(Thread.currentThread().getContextClassLoader(),"xmlrpc.properties");
server.setHandlerMapping(xmlRpcHandlerMapping);
System.out.println("The server started successfully.");
} catch (Exception e) {
System.err.println("Server Error: " + e);
throw new XmlRpcException(e.getMessage());
}
}
@RequestMapping("xmlrpc")
public void serve(HttpServletRequest request, HttpServletResponse response) throws XmlRpcException {
try {
server.execute(request,response);
} catch (Exception e) {
throw new XmlRpcException(e.getMessage(), e);
}
}
}
W xmlrpc.properties サービスは、リクエストを実装するために定義されています。
service=org.vkalashnykov.service.UserService
サービス:
@Service
public class UserService implements UserDetailsService{
@Autowired
private UserDAO userDAO;
@Override
public UserDetails loadUserByUsername(@NotNull String username) throws UsernameNotFoundException {
return userDAO.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("user "+username+ " was not found")); // Here the userDAO is null
}
public String login(@NotNull String username, @NotNull String password){
User user=(User)loadUserByUsername(username);
if (user!=null && user.getPassword().equals(new BCryptPasswordEncoder().encode(password)))
return Statuses.SUCCESS.name();
else
return Statuses.ERROR.name();
}
}
ダオ:
@Component
public class UserDAO{
@Autowired
MongoTemplate mongoTemplate;
public Optional<User> findByUsername(@NotNull String username){
return Optional.ofNullable(mongoTemplate.findOne(
query(
where(UserField.USER_NAME.getField()).is(username)),
User.class));
}
public void save(User user){
mongoTemplate.save(user);
}
}
春のセキュリティ構成:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private UserService userService;
@Bean
public BCryptPasswordEncoder getBCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/xmlrpc").permitAll()
.and()
.csrf().disable();
}
@Autowired
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(getBCryptPasswordEncoder());
}
}
クライアント側には、ログインのためにユーザー名とパスワードをサーバーに送信するアプリケーションがあります。
@FXML
private TextField login;
@FXML
private TextField password;
private String configuration="xmlrpc";
private final String serverUrl="http://localhost:8090/xmlrpc";
private final XmlRpcClient xmlRpcClient=new XmlRpcClient();
public Controller() throws Exception {
final XmlRpcClientConfigImpl config=new XmlRpcClientConfigImpl();
try {
System.out.println("Trying connect to server "+serverUrl);
config.setServerURL(new URL(serverUrl));
} catch (MalformedURLException e) {
System.err.println("Server "+serverUrl+" not found.");
e.printStackTrace();
errorLabel.setText("Server not found.");
throw new Exception("Server not found.");
}
xmlRpcClient.setConfig(config);
System.out.println("Connected to server: "+serverUrl);
}