Файл Grails плагин безопасности пользовательского перенаправления
Я новичок в Groovy и Grails. Я разработал приложение, с помощью Spring Security плагин через базу данных запрашиваемую карте запроса. Мне нужно пользовательское перенаправление на домашние страницы в соответствии с ролями.
Если пользователь является ROLE_ADMIN, он будет перенаправлен на свою домашнюю страницу в views adminUser/Homepage.gsp
Если пользователь является ROLE_USER, он будет перенаправлен на свою домашнюю страницу в views User/Homepage.gsp
Я не могу получить любое пользовательское перенаправление аутентификации в соответствии с логином пользователя.
4 ответа:
Это, как я делаю это. Я изменил его для ваших нужд. Дай мне знать, если это поможет.
Внутри springsecurities LoginController в методе auth() сделайте что-то вроде этого (он получит страницу, на которой пользователь был до нажатия кнопки login):
def auth() { session['returnUrl'] = request.getHeader("Referer") def config = SpringSecurityUtils.securityConfig if (springSecurityService.isLoggedIn()) { redirect uri: config.successHandler.defaultTargetUrl return } String view = 'auth' String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}" render view: view, model: [postUrl: postUrl, rememberMeParameter: config.rememberMe.parameter] }
Теперь внутри src / groovy создайте обработчик успеха auth:
package packageName import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse public class MyAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Override protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) { def returnUrl = request.getSession().getAttribute('returnUrl') // Get current users role using springSecurityService // You can inject springSecurityService into this class // http://stackoverflow.com/questions/6467167/how-to-get-current-user-role-with-spring-security-plugin if (role == 'ROLE_ADMIN') { returnUrl = '/adminUser/Homepage.gsp' } else if (role == 'ROLE_USER') { returnUrl = '/User/Homepage.gsp' } else { returnUrl = 'redirect somewhere' } request.getSession().removeAttribute('returnUrl') return returnUrl } }
Теперь в разделе conf / spring / resources.groovy создать боб, как так:
import grails.plugin.springsecurity.SpringSecurityUtils // Place your Spring DSL code here beans = { authenticationSuccessHandler(packageName.MyAuthSuccessHandler) { def conf = SpringSecurityUtils.securityConfig requestCache = ref('requestCache') defaultTargetUrl = conf.successHandler.defaultTargetUrl alwaysUseDefaultTargetUrl = conf.successHandler.alwaysUseDefault targetUrlParameter = conf.successHandler.targetUrlParameter useReferer = conf.successHandler.useReferer redirectStrategy = ref('redirectStrategy') } }
Тогда вы должны быть хороши, чтобы идти. Дайте мне знать, если это сработает.
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse import grails.plugin.springsecurity.SpringSecurityUtils public class MyAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Override protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) { def returnUrl = request.getSession().getAttribute('returnUrl') def roles = SpringSecurityUtils.getPrincipalAuthorities() for (String role in roles) { if (role.equals("ROLE_ADMIN")) { returnUrl = '/AdminUser/index.gsp' } else if (role.equals("ROLE_USER")) { returnUrl = '/User/index.gsp' } else { returnUrl = '/' } } request.getSession().removeAttribute('returnUrl') return returnUrl } }
Вот мой рабочий код.... вместо введения зависимости я использовал SpringSecurityUtils для получения текущей роли пользователя и перенаправления ее на нужную страницу...... спасибо всем за Вашу поддержку.
@sean3838 спасибо за помощь.....
Вы должны ввести springSecurityService перед вашим методом. Кроме того, getAuthorities() должен возвращать список, так что вам придется перебирать его (это потому, что у людей может быть несколько ролей).
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse public class MyAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { def springSecurityService @Override protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) { def returnUrl = request.getSession().getAttribute('returnUrl') def roles = springSecurityService.getPrincipal().getAuthorities() for (role in roles) { if (role == 'ROLE_ADMIN') { returnUrl = '/adminUser/Homepage.gsp' } else if (role == 'ROLE_USER') { returnUrl = '/User/Homepage.gsp' } } request.getSession().removeAttribute('returnUrl') return returnUrl } }
Предположим, что у вас есть такая строка в вашем BuildConfig:
compile ":spring-security-core:2.0-RC4"
И вот такой код в вашем Бутстрэпе:
def roleAdmin = new Role(authority:LSSRole.ROLE_ADMIN.toString()).save(failOnError: true) def roleFirm = new Role(authority:LSSRole.ROLE_FIRM.toString()).save(failOnError: true) def roleLaw = new Role(authority:LSSRole.ROLE_LAWYER.toString()).save(failOnError: true) def roleFin = new Role(authority:LSSRole.ROLE_FINANCE.toString()).save(failOnError: true)
С примером пользователя admin, созданного с помощью этого кода:
UserRole.create admin, roleAdmin, true
И некоторый код, подобный этому в Config:
'/dbconsole/**': [LSSRole.ROLE_ADMIN.toString()], '/secure/**': [LSSRole.ROLE_ADMIN.toString()], '/payment/**': [LSSRole.ROLE_FIRM.toString()], '/filing/**': [LSSRole.ROLE_FIRM.toString()], '/finance/**': [LSSRole.ROLE_FINANCE.toString()], '/lawyer/**': [LSSRole.ROLE_LAWYER.toString()],
Где LSSRole-это перечисление и некоторый код, подобный этому:
"/" { controller = "dispatch" action = "index" }
В ваших url-приложениях, чтобы перенаправлять пользователей после успешного входа в систему, вы можете построить диспетчер, подобный этому, чтобы отправлять пользователей на разные целевые страницы на основе их роли:
class DispatchController { def index() { def controller = 'login' def action = 'auth' if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_ADMIN.toString())) { controller = 'secure' action = 'index' } else if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_FINANCE.toString())) { controller = 'finance' action = 'index' } else if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_FIRM.toString())) { controller = 'filing' action = 'summary' } else if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_LAWYER.toString())) { controller = 'lawyer' action = 'index' } else { flash.message = 'Where do you think you\'re going? Nno no no' SecurityContextHolder.clearContext() } redirect controller:controller, action:action }
Надеюсь, это поможет.