前提・実現したいこと
Springbootプロジェクトにて、SpringSecurityを使用したログイン機能、
また、フォームからのメール送信機能を持ったアプリを作成しています。
メール送信機能が実装完了後、ログイン機能を実装した所、メール送信が動作しなくなってしまったのを解決したい。
発生している問題・エラーメッセージ
SpringSecurityのログイン機能実装後、フォームからのメール送信が行えなくなってしまった。
該当のソースコード
SendMailController
1@RestController 2public class SendMailController { 3 @Autowired 4 private MailSender mailSender; 5 6 @RequestMapping(value="/sendmail", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE) 7 @ResponseBody 8 public List<String> sendmail(@RequestBody ContactForm form) { 9 String body = "お名前: " + form.getName() + "\n" + 10 "メールアドレス: " + form.getEmail() + "\n" + 11 "メッセージ: \n" + form.getMessage(); 12 SimpleMailMessage msg = new SimpleMailMessage(); 13 msg.setFrom(form.getEmail()); 14 msg.setTo("XXX@gmail.com"); // 適宜変更してください 15 msg.setSubject("お問い合わせがありました"); 16 msg.setText("お問い合わせは下記の通りです。\n\n---------------------------\n" + body + "\n---------------------------"); 17 mailSender.send(msg); 18 return Arrays.asList("OK"); 19 } 20 21} 22
IndexController
1@Controller 2public class IndexController { 3 @GetMapping("/") 4 String index(Model model) { 5 return "index"; 6 } 7 8} 9
indexhtml
1<html xmlns:th="http://www.thymeleaf.org"> 2<head> 3 <meta charset="utf-8"> 4 <link rel="stylesheet" media="all" 5 th:href="@{/webjars/bootstrap/4.3.1/css/bootstrap.min.css}"> 6 <script th:src="@{/webjars/jquery/3.3.1-2/jquery.min.js}"></script> 7 <script th:src="@{js/demo.js}"></script> 8 <title>Send email with Spring Boot</title> 9</head> 10<body> 11 <div class="container"> 12 <h1 class="pb-2 mt-4 mb-2 border-bottom border-primary"> 13 お問い合わせ 14 </h1> 15 <div> 16 <p>以下を入力して送信ボタンをクリックしてください。</p> 17 <form name="contactform" id="contactform" role="form"> 18 <div class="form-group"> 19 <label for="inputName" class="col-sm-3">お名前</label> 20 <div class="col-sm-9"> 21 <input type="text" class="form-control" name="name" 22 placeholder="お名前" value=""> 23 </div> 24 </div> 25 <div class="form-group"> 26 <label for="inputEmail" class="col-sm-3">メールアドレス</label> 27 <div class="col-sm-9"> 28 <input type="email" class="form-control" name="email" 29 placeholder="メールアドレス" value=""> 30 </div> 31 </div> 32 <div class="form-group"> 33 <label for="inputMessage" class="col-sm-3">お問い合わせ内容</label> 34 <div class="col-sm-9"> 35 <textarea class="form-control" name="message" rows="5"> 36 </textarea> 37 </div> 38 </div> 39 <div class="text-center"> 40 <button type="button" name="btnSubmit" 41 class="btn btn-success" id="btnSend">送信する</button> 42 </div> 43 </form> 44 </div> 45 </div> 46</body> 47</html>
demojs
1$(document).ready(function() { 2 $('#btnSend').click(function() { 3 $("#btnSend").prop("disabled", true); 4 // フォームのデータをJSONに変換 5 var rawData = $('#contactform').serializeArray(); 6 var data = {}; 7 jQuery.each(rawData, function(i, e) { 8 data[e.name] = e.value; 9 }); 10 // Ajaxを使ってメールを送信 11 $.ajax({ 12 type: "POST", 13 url: "./sendmail", 14 dataType: "json", 15 data: JSON.stringify(data), 16 contentType: 'application/json', 17 scriptCharset: 'UTC', 18 success: function(outdata, dataType) { 19 if (outdata[0] == "OK") alert("メール送信しました"); 20 $("#btnSend").prop("disabled", false); 21 }, 22 error: function(XMLHttpRequest, textStatus, errorThrown) { 23 alert("Error : " + errorThrown); 24 $("#btnSend").prop("disabled", false); 25 } 26 }); 27 }); 28});
WebSecurityConfig
1@Configuration 2@EnableWebSecurity 3public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 4 5 @Autowired 6 private UserDetailsServiceImpl userDetailsService; 7 8 //フォームの値と比較するためにDBから取得したパスワードは、暗号化しているため、フォームの値も暗号化するため利用 9 @Bean 10 public BCryptPasswordEncoder passwordEncoder(){ 11 BCryptPasswordEncoder bCryptPasswordEncoder= new BCryptPasswordEncoder(); 12 return bCryptPasswordEncoder; 13 } 14 @Override 15 public void configure(WebSecurity web) throws Exception{ 16 web.ignoring().antMatchers("/images/**", 17 "/css/**", 18 "/js/**", 19 "template/index.html" 20 ); 21 } 22 23 @Override 24 protected void configure(HttpSecurity http) throws Exception{ 25 http 26 .authorizeRequests() 27 //.antMatchers("/userList").permitAll()//test用(ユーザーリスト)※終わったら消す。 28 .anyRequest().authenticated()//上記以外は全て認証無しの場合アクセス不許可 29 .and() 30 .formLogin() 31 .loginPage("/login") //ログインページはコントローラを経由しないのでViewNameとの紐付けが必要 32 .loginProcessingUrl("/login") //フォームのSubmitURL、このURLへリクエストが送られると認証処理が実行される 33 .usernameParameter("username") //リクエストパラメータのname属性を明示 34 .passwordParameter("password") 35 .defaultSuccessUrl("/userList", true) //認証が成功した際に遷移するURL 36 .failureUrl("/login?error") //認証が失敗した際に遷移するURL 37 .permitAll() //どのユーザでも接続できる。 38 .and() 39 .logout() 40 .logoutUrl("/logout") 41 .logoutSuccessUrl("/login?logout") 42 .permitAll(); 43} 44 45 @Autowired 46 public void configure(AuthenticationManagerBuilder auth) throws Exception{ 47 auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 48 } 49 50} 51
試したこと
SpringSecurityを外すとメール送信ができることを確認。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/12 03:18
2021/06/12 04:44 編集
2021/06/12 04:33
2021/06/12 06:40
2021/06/12 13:40 編集
2021/06/12 14:54
2021/06/12 15:45
2021/06/12 15:46
2021/06/12 22:45
2021/06/13 00:04
2021/06/13 03:57
2021/06/13 05:29
2021/06/14 04:15
2021/06/14 11:45