Java secure spring petclinic的每个用户都有单独的mysql登录
为了学习spring安全性,我在spring petclinic示例中添加了安全性。我注意到petclinic应用程序配置为使用相同的用户名和密码将所有用户登录到MySQL。如何更改petclinic的配置,使petclinic应用程序的每个用户都能够使用自己唯一的用户名和密码登录MySQL 这是。请注意,MySQL部分在我的版本中没有注释,而HSQL部分在我的版本中被删除。需要为每个用户动态设置Java secure spring petclinic的每个用户都有单独的mysql登录,java,mysql,spring,spring-mvc,jpa,Java,Mysql,Spring,Spring Mvc,Jpa,为了学习spring安全性,我在spring petclinic示例中添加了安全性。我注意到petclinic应用程序配置为使用相同的用户名和密码将所有用户登录到MySQL。如何更改petclinic的配置,使petclinic应用程序的每个用户都能够使用自己唯一的用户名和密码登录MySQL 这是。请注意,MySQL部分在我的版本中没有注释,而HSQL部分在我的版本中被删除。需要为每个用户动态设置数据访问.properties中当前引用的jdbc.username和jdbc.password 这
数据访问.properties
中当前引用的jdbc.username
和jdbc.password
这是
我在应用程序中添加了SecurityConfig.java
,以设置Spring安全性,如下所示:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.usernameParameter("j_username")
.passwordParameter("j_password")
.loginProcessingUrl("/j_spring_security_check")
.failureUrl("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/somelogout")
.logoutSuccessUrl("/login")
.and()
.authorizeRequests()
.antMatchers("/**").hasRole("MODERATOR")
.antMatchers("/j_spring_security_check").permitAll()
.and()
.userDetailsService(userDetailsService);
}
}
我还创建了一个与MySQL中的用户表相对应的User
类和一个与MySQL中的角色表相对应的Role
类,以及spring中的样板Service
和DAO
stuff,以管理每个用户的身份验证和授权检索
我希望MySQL能够使用触发器记录有关用户活动的信息,因此我需要以某种方式将用户的身份发送到数据库中,我认为最干净的方法可能是让每个用户唯一地登录到MySQL,而不是将用户的身份嵌入到MVC架构的每个组件中,以实现一个简单的日志系统。我正在使用JPA,如果这很重要的话
我如何设置它?这是一种方法 另一个是MySQL的应用程序级凭证,只有应用程序知道。您不会使用触发器记录活动信息;您可以从中间层在应用程序中的适当位置插入记录。您将为每个新用户创建一个会话ID,并将事件与之关联 一个用户可以有多个会话,因此如果知道单个会话很重要,则必须找到将用户凭据与会话关联的方法
但它将简化数据库并将所有事件保持在中间层。使用Java进行控制可能更容易。如果您可以将事件插入到数据库中,那么您的响应也会更好。您没有。您不应授予单个用户对数据库的直接访问权限。在mysql中创建一个帐户供代码使用,然后在自己的代码中执行应用程序级安全性。除非您在数据库中创建了大量视图,并且只授予这些用户访问这些视图的权限,而这些视图会进行安全筛选,否则您将无法阻止人们随意翻找。不,对不起。宠物诊所?这是90年代后期的一个J2EE演示问题。这仍然与此相关吗?我可以从
request.getSession().getId()
中获取会话ID,但我认为您的建议需要我在复杂的体系结构中编写大量代码。你能指出一个我可以学习的好例子,这样我就不会造成不必要的复杂性吗?